2012-10-02 10 views
8

私は何千ものクラスから結果を返すことができる複数のサービスを持っています。
各CXFサービスには、ほぼ同じプライベートなJAXBコンテキストが含まれているため、膨大なメモリが消費されます。
JAXBコンテキストを自分で作成し、サービス間で共有する方法はありますか?複数のサービス間でCXF jaxbコンテキストを再利用

+0

興味深い質問ですが、私は答えは分かりません。 –

+1

これはjaxrs用ですが、jaxwsでも使えるかもしれません:http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –

答えて

3

それはSpring構成に次の添加によるもので解決する1つの可能な方法:

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

値がグローバル(単一)たJAXBContextを保持し、以下の方法を有する豆を単に参照され:

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

次のスレッドで(CXF教祖ダニエルKulpの入力を含む)の詳細を見ることができます:
Reuse-JAXB-context-in-jaxws

私は、最初のサービスによってコンテキストが設定された後に返されるinitializeメソッドに "if"ステートメントがあるので、複数のサービスのグローバルインスタンスとして現在のJAXBDataBindingを設定することができないことを発見しました。
私はクラスを拡張し、必要なサービスクラスとモデルをすべて収集することになったのです。すべてのサービスの初期化が終了したら、必要なすべてのクラスを含むグローバルコンテキストを作成し、すべてのサービスに返します。
次のクラスを使用できます。
すべてのWebサービスが初期化されたら、compileGlobalJAXBContextメソッドを呼び出してグローバルコンテキストを作成します。アプリケーションが必要とし、initが見逃している他のクラスを追加することができます。
このBeanで動作するようにサービスを設定しないでください。エディタは、私はこれだけ、関連する記号と等号の単語を置き換えcompileGlobalJAXBContextの最後の行で等号を追加できませんでしたいくつかの奇妙な理由で

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

+0

これは少しですあなたはまだそれを持っている場合、クラスを投稿する気になりますか? – DarthPablo

+0

@DarthPablo私はクラスを添付しました –

+0

ありがとう - それは非常に便利です! – DarthPablo

関連する問題