2012-10-02 12 views
8

Ho più servizi che possono restituire risultati su migliaia di classi.
Poiché ogni servizio CXF contiene un contesto JAXB privato quasi identico, provoca un enorme spreco di memoria.
C'è un modo per creare il contesto JAXB da solo e condividerlo tra i servizi?Riutilizzo contesto Jaxb CXF tra più servizi

+0

Interessante domanda, ma non conosco la risposta. –

+1

Questo è per jaxrs, ma potrebbe funzionare anche per jaxws: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –

risposta

3

Un modo possibile per risolverlo è aggiungendo la seguente alla configurazione molla:

<bean class="org.apache.cxf.jaxb.JAXBDataBinding" > 
    <constructor-arg index="0" value="#{GlobalContextBean.context}"/> 
</bean> 

Se il valore è solo un riferimento ad un bean che detiene il globale (singolo) JAXBContext ed ha il seguente metodo :

public javax.xml.bind.JAXBContext getContext() {...} 

È possibile visualizzare maggiori informazioni (tra cui il guru CXF ingressi Daniel Kulp) in questo thread:
Reuse-JAXB-context-in-jaxws

Dopo averlo testato, ho scoperto che l'impostazione dell'attuale JAXBDataBinding come un'istanza globale per più servizi non funzionerà poiché è presente un'istruzione "if" nel suo metodo di inizializzazione che restituisce una volta che il contesto è stato impostato dal primo servizio.
Ecco perché sono finito estendendo la classe e raccogliendo tutte le classi di servizi e modelli necessari. Al termine dell'inizializzazione dei servizi, creo un contesto globale con tutte le classi richieste e lo restituisco a tutti i servizi.
È possibile utilizzare la seguente classe.
Dopo aver inizializzato tutti i servizi Web, chiamare il metodo compileGlobalJAXBContext per creare il contesto globale. Puoi aggiungere altre classi di cui l'applicazione ha bisogno e l'init perse.
Non dimenticare di configurare i servizi per lavorare con questo bean.

public class GlobalJAXBDataBinding extends JAXBDataBinding 
{ 
private Set<Class<?>> globalContextClasses; 
private boolean contextBuilt = false; 

public GlobalJAXBDataBinding(Set<Class<?>> classes) { 
    globalContextClasses = new HashSet<>(classes); 
    globalContextClasses.add(CPUUID.class); 
} 

public GlobalJAXBDataBinding() { 
} 

} 

public synchronized void initialize(Service service) { 
    if (contextBuilt) 
     return; 
    super.initialize(service); 
    globalContextClasses.addAll(getContextClasses()); 
    super.setContext(null); 
} 

public void compileGlobalJAXBContext() { 
    if (contextBuilt) return; 
    setContext(JAXBContext.newInstance(globalContextClasses)); 
    contextBuilt *equals* true; 
} 

Per qualche strana ragione l'editor non mi ha lasciato di aggiungere il segno di uguale nell'ultima riga di compileGlobalJAXBContext quindi basta sostituire la parola pari con il segno di riferimento.

+0

Apprezzo che questo è un po ' vecchio ora, ma ti dispiacerebbe postare la lezione se ce l'hai ancora? – DarthPablo

+0

@DarthPablo Ho allegato la classe –

+0

Grazie - è molto utile! – DarthPablo

Problemi correlati