2012-10-02 9 views
8

Ich habe mehrere Dienste, die Ergebnisse aus Tausenden von Klassen zurückgeben können.
Da jeder CXF-Dienst einen privaten, fast identischen JAXB-Kontext enthält, verursacht dies eine enorme Speicherverschwendung.
Gibt es eine Möglichkeit, den JAXB-Kontext selbst zu erstellen und zwischen den Diensten zu teilen?CXF-Jaxb-Kontext zwischen mehreren Diensten erneut verwenden

+0

Interessante Frage, aber ich kenne die Antwort nicht. –

+1

Dies ist für Jaxrs, aber möglicherweise wird es auch für Jaxws funktionieren: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserklassen –

Antwort

3

Ein möglicher Weg, indem Sie folgende an der Feder Konfiguration ist es zu lösen:

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

Wenn der Wert nur ein Verweis auf eine Bohne, die die globale (single) JAXBContext hält und die folgende Methode hat :

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

können Sie weitere Details sehen (einschließlich des CXF-Guru Daniel Kulp Eingänge) in folgendem Thread:
Reuse-JAXB-context-in-jaxws

Nach dem Testen habe ich festgestellt, dass das Setzen der aktuellen JAXBDataBinding als globale Instanz für mehrere Dienste nicht funktioniert, da es eine "if" -Anweisung in seiner initialize -Methode gibt, sobald der Kontext vom ersten Dienst gesetzt wurde.
Aus diesem Grund habe ich die Klasse erweitert und alle erforderlichen Serviceklassen und Modellklassen gesammelt. Nachdem die Initialisierung aller Dienste beendet ist, erstelle ich einen globalen Kontext mit allen erforderlichen Klassen und gebe ihn an alle Dienste zurück.
Sie können die folgende Klasse verwenden.
Nachdem alle Webdienste initialisiert wurden, rufen Sie die compileGlobalJAXBContext-Methode zum Erstellen des globalen Kontexts auf. Sie können dort weitere Klassen hinzufügen, die die Anwendung benötigt und die init verpasst hat.
Vergessen Sie nicht, die Dienste für die Arbeit mit dieser Bean zu konfigurieren.

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; 
} 

Aus irgendeinem seltsamen Grunde der Editor nicht ich das Gleichheitszeichen in der letzten Zeile der compileGlobalJAXBContext hinzufügen ließ so ersetzen Sie einfach das Gleichheits Wort mit dem entsprechenden Zeichen.

+0

Ich weiß, das ist ein bisschen jetzt alt, aber würde es dir etwas ausmachen, die Klasse zu posten, wenn du sie noch hast? – DarthPablo

+0

@DarthPablo Ich habe die Klasse –

+0

Vielen Dank - das ist sehr hilfreich! – DarthPablo

Verwandte Themen