私は何千ものクラスから結果を返すことができる複数のサービスを持っています。
各CXFサービスには、ほぼ同じプライベートなJAXBコンテキストが含まれているため、膨大なメモリが消費されます。
JAXBコンテキストを自分で作成し、サービス間で共有する方法はありますか?複数のサービス間でCXF jaxbコンテキストを再利用
答えて
それは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;
}
。
これは少しですあなたはまだそれを持っている場合、クラスを投稿する気になりますか? – DarthPablo
@DarthPablo私はクラスを添付しました –
ありがとう - それは非常に便利です! – DarthPablo
- 1. jaxb xsdスキーマの再利用
- 2. Jenkinのパイプラインでステージ間で複数のノードを再利用
- 3. PHPフレームワークで複数のプロジェクト間でコードを再利用
- 4. reduxの複数のレデューサー間でアクションを再利用
- 5. Ruby on Rails:他の複数のアクション間でコードを再利用
- 6. 複数のRailsアプリケーション間でRubyコードを再利用する
- 7. SAPUI5 - 複数のアプリケーション間で断片を再利用
- 8. 複数のパラメータを持つCXF Webサービス
- 9. 複数のUICollectionViewControllersでUICollectionViewを再利用
- 10. 複数のTabItemでデータグリッドを再利用
- 11. CXF JAXBベーシックEquals/Hashcode
- 12. Pentaho - 再利用フィールドクエリで複数回
- 13. openssl x509storeを別々のsslコンテキスト間で再利用できますか?
- 14. 複数のスーパークラスとコードの再利用
- 15. パラメータを複数回再利用
- 16. gtk_file_chooser_dialogを複数回再利用
- 17. CXFパラメータoptimaization CXF Webサービスで
- 18. CXFとJAX-WS標準間の利点
- 19. Apache CXFは、JAXBコンテキストに「既知」の追加クラスを作成します。
- 20. Webサービス/クライアント間でJAXBオブジェクトを渡す
- 21. CXF JAXRSクライアントがTCP接続を再利用しない
- 22. JAXB親クラスからの再利用アノテーションとアクセスプリセットフィールド
- 23. WHERE節内で複数の変数を再利用する
- 24. Basic ES6 Javascript Plugin - 関数間で変数を再利用
- 25. プロジェクト間でのコードの再利用
- 26. アプリケーション間でのSQLストアドプロシージャの再利用
- 27. 異なるrspecコンテキストでのコードの再利用
- 28. CQLinqコードを複数のクエリで再利用できますか?
- 29. AngularJSで再利用可能な関数またはサービス
- 30. ReactJSの複数のスクリプトでコンポーネントの定義を再利用
興味深い質問ですが、私は答えは分かりません。 –
これはjaxrs用ですが、jaxwsでも使えるかもしれません:http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –