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
risposta
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.
Apprezzo che questo è un po ' vecchio ora, ma ti dispiacerebbe postare la lezione se ce l'hai ancora? – DarthPablo
@DarthPablo Ho allegato la classe –
Grazie - è molto utile! – DarthPablo
- 1. cxf: genera il costruttore jaxb con argomenti
- 2. CXF e più servlet mapping
- 3. Differenza tra CXF e JAX-WS
- 4. Eccezione JAXB: Classe non nota in questo contesto
- 5. JAXB creazione di contesto e marshaller costano
- 6. Confronto tra Sun Metro e Apache CXF per lo sviluppo di servizi web?
- 7. Apache CXF, generazione di servizi Web dal file WSDL
- 8. Uso XMLBeans binding per WSDL2Java cxf
- 9. Differenza tra Apache CXF e Axis
- 10. Microsoft webservice e client CXF: JAXB non riesce a capire "s: schema"
- 11. Test unità CXF
- 12. Fai andare JAXB più veloce
- 13. dove trovare cxf/cxf.xml, cxf-extension-soap.xml, cxf-servlet.xml
- 14. CXF JAXRS - Come caricare più di un parametro
- 15. Riutilizzo della stessa pagina più volte
- 16. Riutilizzo di una PreparedStatement più volte
- 17. Caricamento di più file e metadati con CXF
- 18. Cosa significa CXF in "Apache CXF"?
- 19. Ignora gestione errori CXF
- 20. Riutilizzo di un filestream
- 21. NSScrollView scroll infinito/infinito | Riutilizzo secondario riutilizzo
- 22. Condividere un file di registro tra più servizi (ogni servizio con più thread), come?
- 23. Convalida XML lato server con CXF Webservice
- 24. iOS5 Storyboard: Riutilizzo personalizzato UITableViewCell in più UITableViewControllers
- 25. Installazione CXF con Eclipse 3.5
- 26. Riutilizzo HttpURLConnection
- 27. Assistente client Eclipse Web Service e CXF
- 28. Più servizi Cloud Azure in un'unica soluzione
- 29. Integrità referenziale dei dati tra i servizi
- 30. Throttle numero di richieste tra servizi WCF
Interessante domanda, ma non conosco la risposta. –
Questo è per jaxrs, ma potrebbe funzionare anche per jaxws: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –