低速のWebサービス(各リクエストで約4分)を使用していて、2時間で約100のリクエストを実行する必要があるため、複数のスレッドを使用することにしました。問題は、スタブが他のすべてのスレッドを拒否するため、2つのスレッドしか持てないことです。ここで私は説明と可能な解決策を見つけました:
私も同じ問題を抱えていました。そのソースはMultiThreadedHttpConnectionManagerのdefaultMaxConnectionsPerHost値が2に等しいようです。私にとっての回避策は、MultiThreadedHttpConnectionManagerの独自のインスタンスを作成し、それをサービススタブで使用することでした。
著者が言ったように、より高いsetMaxTotalConnectionsとsetDefaultMaxConnectionsPerHost値を持つスタブにHttpClientを渡しましたが、問題は、アプリケーションがフリーズすることです(まあ、実際にはフリーズしませんが、何もしません)。
それが私のコードです:
public ReportsStub createReportsStub(String url, HttpTransportProperties.Authenticator auth){
ReportsStub stub = null;
HttpClient httpClient = null;
try {
stub = new ReportsStub(url);
httpClient = createHttpClient(10,5);
stub._getServiceClient().getOptions().setTimeOutInMilliSeconds(10000000);
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth);
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, false);
stub._getServiceClient().getServiceContext().getConfigurationContext().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
return stub;
} catch (AxisFault e) {
e.printStackTrace();
}
return stub;
}
protected HttpClient createHttpClient(int maxTotal, int maxPerHost) {
MultiThreadedHttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = httpConnectionManager.getParams();
if (params == null) {
params = new HttpConnectionManagerParams();
httpConnectionManager.setParams(params);
}
params.setMaxTotalConnections(maxTotal);
params.setDefaultMaxConnectionsPerHost(maxPerHost);
HttpClient httpClient = new HttpClient(httpConnectionManager);
return httpClient;
}
次に、そのスタブとリクエストを各スレッドに渡して実行します。HttpClientを設定せずにデフォルトを使用すると、2つのスレッドのみが実行され、設定するとアプリケーションが機能しなくなります。何か案が?