1

Axis2 1.5.1 プロジェクトを使用するコードで効率的に使用されていない HttpConnections。ホストごとの最大接続数に特定の制限を設定し、アプリケーションに負荷をかけることで、意図的な制限に従って応答性が期待したほど良くなく、接続が無期限に停止することもあったため、利用可能な接続は毎回少なくなり、要求がまったく応答されなくなりました。アプリケーションによって。

構成:

MultiThreadedHttpConnectionManager connManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams connectionManagerParams = connManager.getParams();
connectionManagerParams.setMaxTotalConnections(httpMaxConnections);
connectionManagerParams.setDefaultMaxConnectionsPerHost(httpMaxConnectionsPerHost);

HttpClient httpClient = new HttpClient(connManager);

ConfigurationContext axisContext;
try {
    axisContext = ConfigurationContextFactory.createDefaultConfigurationContext();
} catch (Exception e) {
    throw new AxisFault(e.getMessage());
}

axisContext.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);

service = new MyStub(axisContext, url);

ServiceClient serviceClient = service._getServiceClient();

serviceClient.getOptions().setProperty(HTTPConstants.CONNECTION_TIMEOUT, httpConnectionTimeout);
serviceClient.getOptions().setProperty(HTTPConstants.SO_TIMEOUT, httpReadTimeout);
serviceClient.getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Constants.VALUE_TRUE);

ご覧のとおり、max を定義しています。接続とタイムアウト。

私のように急いでいる誰かを助けることを望んで、共有する回避策があります。専門家からのより良い回答がない場合は、数日後に私の回答を良いものとしてマークします。

4

1 に答える 1

3

1) スタックした接続を防ぐための PoolTimeout (何らかの理由で)

次の行は、Axis2 が永続的にスタックした接続を失うのを防ぐのに役立ちました。

httpClient.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, 1000L);

このエントリでは、これをPoolTimeoutと呼びましょう。Integer (または int) は ClassCastException を発生させ、サービスがクライアントの外部でトリガーされることさえ防ぐため、Long であることを確認してください。

あなたが開発していて Axis を使用しているシステムは、別のシステムのクライアントになる可能性があります。そして、その他のシステムには確かに特定のConnectionTimeoutがあります。だから私は提案します

PoolTimeout <= ConnectionTimeout

例:

serviceClient.getOptions().setProperty(HTTPConstants.CONNECTION_TIMEOUT, httpConnectionTimeout);
httpClient.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, Long.valueOf(httpConnectionTimeout) );

2) 接続解除

私は接続管理に Amila の提案を使用していましたが、実際には接続は事前に予想していたほど速く解放されませんでした (私のチューニング構成に応じて制限に合わせて応答するようにモックされた外部システムの遅延時間を意識的に準備したため)。

したがって、メソッドorg.apache.axis2.client.OperationClient.executeImpl(boolean)の次の行は、使用されるとすぐにプール内の接続を使用可能としてマークするのに役立つことがわかりました。

HttpMethod method = (HttpMethod) getOperationContext().getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)
        .getProperty(HTTPConstants.HTTP_METHOD);
method.releaseConnection();

これは、 serviceClient.cleanupTransport()を呼び出すときに Axis が行おうとしていることですが、コンテキストが正しくないようです。

現在、パフォーマンス調整は予測可能な方法で機能しているため、運用ニーズに最適な調整構成を選択するのはインテグレーターの手に委ねられています。

より良い答えは高く評価されます。

于 2013-10-04T17:29:23.833 に答える