4

スタブは、Axis2 1.5.4 スレッドセーフを介して (XMLBeans バインディング オプションを使用して) WSDL2JAVA によって生成されますか?

実際、複数のスレッドを介して呼び出す Web サービス用に 1 つのスタブを作成しました。私は自分自身を構成し、同様MultiThreadedHttpConnectionmanagerに設定しましたが、各呼び出しの後に呼び出す NullPointerExceptions がいくつか見られます。HTTPConstants.REUSE_HTTP_CLIENTstub._getServiceClient().cleanupTransport

スレッドがハングすることもあります。

同時に、Web サービスの操作メソッドで生成された Stub で、finally ブロックで cleanup() が既に呼び出されていることに気付きました。stub._getServiceClient().cleanupTransport後で自分に電話しない方がいいですか?

私のコード:

        httpConnMgr = new MultiThreadedHttpConnectionManager();
        HttpConnectionManagerParams params = httpConnMgr.getParams();
        if (params == null) {
            params = new HttpConnectionManagerParams();

        }
        params.setDefaultMaxConnectionsPerHost(numberOfThreads);
        httpConnMgr.setParams(params);
        HttpClient httpClient = new HttpClient(httpConnMgr);

        service = new Service1Stub(this.endPointAddress);
        service._getServiceClient().getOptions()
                .setTimeOutInMilliSeconds(this.timeOut);
        service._getServiceClient().getOptions()
                .setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE);
        service._getServiceClient().getOptions()
        .setProperty(HTTPConstants.AUTO_RELEASE_CONNECTION, Boolean.FALSE);
        service._getServiceClient()
                .getOptions()
                .setProperty(HTTPConstants.SO_TIMEOUT, (int) (this.timeOut));
        service._getServiceClient()
                .getOptions()
                .setProperty(HTTPConstants.CONNECTION_TIMEOUT,
                        (int) (this.timeOut));
        service._getServiceClient().getServiceContext().getConfigurationContext()
                .setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);

一方、生成されたスタブでは、cleanUp が既に呼び出されていることに気付きました。

   finally {
            _messageContext.getTransportOut().getSender().cleanup(_messageContext);
        }

どんな提案でも大いに役に立ちます。ありがとう。

4

1 に答える 1

7

少し前に Axis2 を調べたとき、スレッドセーフに関する質問もありました。

Axis2 のスレッド セーフに関する情報を見つけるのは困難でしたが、最終的に次の Jira イシューにたどり着きました: https://issues.apache.org/jira/browse/AXIS2-4357

次のことが述べられています。

Axis2 クライアント側はスレッド セーフではありません。これは、プロジェクトの最初からそうでした [...] スレッドごとに異なるスタブを使用する [...]

問題自体は、Won't Fixステータスと次のメモとともにクローズされます。

Axis2 スタブはスレッドセーフではありません。Deepal が指摘したように、これは仕様によるものです。

それはその時私のためにそれをしました。

基本的に、スレッドごとに 1 つのスタブを使用する必要があります。または、(私の記憶が正しければ) スタブを再利用できるようにスタブ プールを使用することもできます (ただし、問題を回避するには、スレッドごとに 1 つのスタブを使用する必要があります)。他の人はスタブプールを使用して成功しているようです (関連する SO の質問はこちらを参照してください)。

スレッド セーフに関して私が通常従う 1 つのアドバイスは、次のとおりです

于 2011-05-14T19:26:22.150 に答える