21

私の Web サービス クライアント アプリケーションは、Apache CXFを使用して、複数の Web サービスと通信するためのクライアント スタブを生成します。生成された CXF Web サービス スタブ オブジェクトのメモリ フットプリントは非常に大きくなります (10 ~ 15 個の Web サービス オブジェクトが 64 MB を超えるメモリを必要とします)。CXF オブジェクトのフットプリントを減らす方法はありますか?

4

3 に答える 3

1

Axis でも同様の問題がありました。私たちが抱えていた問題は、Web サービスに対して多数の同時呼び出しを行う必要があり、WSDL を使用して生成された Axis クライアントにより、各クライアントが大量のメモリを使用することでした。クライアントはスレッドセーフではないため、リクエストごとに 1 つのクライアントを作成する必要がありました。

2 つの選択肢がありました。最初に、生成されたコードを削除することができましたが、これはメンテナンス上の理由から適切ではありませんでした。

2 番目に、WSDL を単純に整理して、関係のない部分を削除し、スリム化されたクライアントを再生成しました。そうすれば、1 つのサービス メソッドを呼び出した場合、クライアントには、そのスレッドが使用しない無関係なメソッドのバルクが含まれません。

非常にうまく機能しましたが、WSDL が更新されるたびに (たとえば、パートナーが Web サービスの新しいバージョンをリリースするなど)、削減された wsdl の作成に時間を費やす必要があるため、依然としてメンテナンスの悪夢です。理想的な解決策は、パートナーに私たちの問題を認識してもらい、削減された WSDL の所有権を取得してもらうことです。

于 2011-05-23T20:20:42.110 に答える
0

SOAPのニーズが非常に基本的なものである場合は、メモリ効率が非常に高いkSOAP2を調べることができます。これは、J2ME電話アプリケーションで正常に動作するように設計されています。

于 2011-09-23T11:35:03.907 に答える
0

CXFクライアントには別のアプローチを採用しました。私はそのメモリフットプリントを調べていません。これは私たちのコンテキストでは問題ではありませんが、スタブを作成するよりも確かに簡単な開発方法です。これは次のようになります。

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

factory.setAddress(endpoint);
factory.getServiceFactory().setDataBinding(new AegisDatabinding());
factory.setServiceClass(myInterface.class);
Object client = factory.create();
((BindingProvider) client).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);

myInterface stub = (myInterface)client;

実行時に接続したいWSに対してこれを実行します(もちろん、さらに単純化するためにいくつかのユーティリティクラスを構築しました)(もちろん、Javaインターフェイスがある場合)。私たちの目標は、WS全体をプログラマーに対して可能な限り透過的にすることでした。私たちは、WSDLやXSD自体にはまったく関心がありません。私たちは一人ではないと思います。

于 2011-06-11T18:48:20.650 に答える