2017-01-27 20 views
0

接続するサービスにWSSEセキュリティが必要なため、スレッドセーフではないため、アプリケーションの異なるクライアント間でポートオブジェクトを共有できないため、Apache CXFクライアントにメモリの問題があります。 私たちはApache Commons pool2を使ってx個のオブジェクトをプールしています。 CXFクライアントが接続するサービスは、非常に大きく複雑なxmlオブジェクトを返します.jProfilerを使用して気付いたようなものは です。プーリングしているポートオブジェクトは返された複合応答オブジェクトへの参照を持っています。メモリが解放されていないGCを実行します。サービスがビジー状態になると、メモリの問題が発生します。 まず、CXFではこれが正常です.2番目に、CXFにこれらの参照にハングアップして自分自身をきれいにしないように指示する方法がありますか?Apache CXFクライアントメモリ

非常に基本的な例として、これは、アプリケーションが任意の助けをいただければ幸いです

{ 
    webServicesPT webServicesPT = clientPool.getPort(); // calls borrowObject() 

    try { 
     webServicesPT.service(); 
    } finally { 
     clientPool.returnPort(webServicesPT); // calls returnObject() 
    } 
} 

を起動時にプールが作成された後、我々はポートを使用している方法です。

ありがとうございました。

答えて

1

ここで説明したのとまったく同じ問題がありました。実際に興味深いのは、Apache CXFライブラリの観点からはすべてが論理的だということです。ライブラリはWeakHashMapを使用してresponseContextを格納します。マップで使用されるキーは、Threadオブジェクトそのものです。アプリケーションがスレッドプールを使用してApplication Server上で実行され、Webサービスコールが異なるスレッドから行われるため、ClientImpl.responseContext WeakHashMapから最後のレスポンスが削除されることはありません。スレッド自体はガベージコレクションされません。そしてあなたの応答が大きければ、メモリがいっぱいになり、メモリリークの問題があるように見えます。

ソリューションは、以下の通りです:あなたは、次のコードを使用してプールするサービスポートインスタンスを返すときに、手動でresponseContextをクリアする必要があります。

ClientProxy.getClient(webServicesPT).getResponseContext().clear();