21

WS クライアント側ポートの初期化は非常にコストがかかるため、同じインスタンスを再利用したいと考えています。また、各呼び出しの前に BindingProvider/RequestContext に異なる値を設定したいと考えています。最初にこれを行いたいと思います:

MyService service = new MyService(wsdlURL, name); 
MyPort myPort = service .getMyServicePort(); 

その後、各呼び出しの前にこれを行います:

Map requestContext = ((BindingProvider)myPort ).getRequestContext(); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, uName); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pWord); 
myPort.someFunctionCall();

私の質問は、このコード スレッドは安全ですか? JAX-WS のドキュメントは、それがスレッドセーフではないことを示しているようです。ただ、CXFは気をつければそうらしい。特にJAX-WS とMetroがスレッドセーフでない場合、ポートまたは ws 操作へのアクセスを同期せずにスレッドセーフを確保する方法はありますか?

4

1 に答える 1

16

JAX-WS / Metroの場合、これはスレッドセーフではありません。最善の策は、プロキシのプールを作成し、必要に応じて、プールからプロキシをプルして構成し、使用し、設定値をクリアして、プールに戻ることです。

または、CXFを使用します。

于 2010-12-08T12:38:24.673 に答える