2012-02-10 7 views
2

Java Webアプリケーションでは、リモートソープサービスを呼び出す必要があり、CXF 2.5.0で生成されたクライアントを使用しようとしています。 SOAPサービスは特定のERPベンダーによって提供され、そのwsdlは怪物であり、何千ものタイプ、数十種類のxsdインポートなどです.wsdl2javaは、-autoNameResolutionフラグのおかげでクライアントを生成します。しかし、実行時にリモートwsdlを2回、つまりサービスオブジェクトを作成するときと、ポートオブジェクトを作成するときに2回ずつ取得します。CXFクライアントはサービスとポートの両方に対してwsdlをロードしますか?

MyService_Service myService = new MyService_Service(giantWsdlUrl); // fetches giantWsdl 
MyService myPort = myService.getMyServicePort(); // fetches giantWsdl again 

なぜですか?私はmyServiceを作成するときにそれを取得することを理解することができます、私は現在使用しているクライアントと一致するかを確認したい、またはランタイムwsdlの場所は、エンドポイントアドレスなどを指示させることができます。それはすべてただのために電線に出て行った。何か不足していますか?

これはWebアプリケーションにあり、I can't be sure that myPort is threadsafeなので、各スレッドのポートを作成する必要がありますが、それはあまりにも遅く、怪しいwsdlのおかげで6〜8秒です。または、私自身のプールを追加し、事前に束を作り、チェックアウトとチェックインを行います。ヤック

レコードの場合、JaxWsProxyFactoryBean creation routeではありません。はこれまでにwsdlをフェッチしていますが、これは私の状況に適しています。最初のcreate()ではまだ長い時間がかかりますが、その後のcreate()では約4分の1秒です。そして、私は知りません...それは、鍵を回すのではなく、物事のホットワイヤーの下にいるように感じます。 :)

答えて

1

さて、あなたは実際にあなた自身の質問に実際に答えました。 service.getPort()を呼び出すたびに、WSDLがリモートサイトからロードされ、解析されます。 JaxWsProxyFactoryBeanは全く同じ方法ですが、プロキシが取得されると、それ以降の呼び出しで再利用されます。そのため、1回目の走行は遅く(「ウォーミングアップ」のため)、その後は速くなります。

はい、JaxWsProxyFactoryBeanはスレッドセーフではありません。プーリングクライアントプロキシはオプションですが、残念ながら多くのメモリを使用します。JAX-WS runtime model is not shared among client proxies;同期は、おそらくより良い方法です。

+0

私が理解したいと思っていたのは、ポートオブジェクトが作成されるたびにサービスオブジェクトが作成されるたびに* wsdlがフェッチされる理由です。それがバグであれば、それは私が正しいことをしていないなど、それは私のデザインに本物のmonkeywrenchをスローします。また、JaxWsProxyFactoryBeanを使用してリモートwsdlをフェッチしないで、私はそれを渡さず、デフォルトを要求しません。私が与えるのは、エンドポイントアドレスだけです。 –

+0

奇妙な。おそらくあなたのサービスを作成する方法は最適ではありません。次のコードを試してください: 'MySEI sei = Service.getPort(MySEI.class);'。 –

関連する問題