0

低速のWebサービス(各リクエストで約4分)を使用していて、2時間で約100のリクエストを実行する必要があるため、複数のスレッドを使用することにしました。問題は、スタブが他のすべてのスレッドを拒否するため、2つのスレッドしか持てないことです。ここで私は説明と可能な解決策を見つけました:

私も同じ問題を抱えていました。そのソースはMultiThreadedHttpConnectionManagerのdefaultMaxConnectionsPerHost値が2に等しいようです。私にとっての回避策は、MultiThreadedHttpConnectionManagerの独自のインスタンスを作成し、それをサービススタブで使用することでした。

著者が言ったように、より高いsetMaxTotalConnectionssetDefaultMaxConnectionsPerHost値を持つスタブに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つのスレッドのみが実行され、設定するとアプリケーションが機能しなくなります。何か案が?

4

2 に答える 2

1

誰かがWSO2Axis2で動的RESTクライアントを作成したい場合は、次のコードが役に立ちました...

// Set the max connections to 20 and the timeout to 20 seconds
MultiThreadedHttpConnectionManager multiThreadedHttpConnectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
params.setDefaultMaxConnectionsPerHost(20);
params.setMaxTotalConnections(20);
params.setSoTimeout(20000);
params.setConnectionTimeout(20000);
multiThreadedHttpConnectionManager.setParams(params);
HttpClient httpClient = new HttpClient(multiThreadedHttpConnectionManager);

// Create the service client
ServiceClient serviceClient = new ServiceClient();
Options options = new Options();
options.setTo(new EndpointReference(endpoint));
options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);
options.setProperty(Constants.Configuration.HTTP_METHOD, Constants.Configuration.HTTP_METHOD_POST);

serviceClient.getServiceContext().getConfigurationContext().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
serviceClient.setOptions(options);

// Blocking call
OMElement result = serviceClient.sendReceive(ClientUtils.getRestPayload());  // just a dummy payload <root></root>

// Cleanup Transport after each call, this is needed to otherwise the HTTP gets blocked
serviceClient.cleanupTransport();

最大接続数を20に、タイムアウトを20秒に設定しました。また、「エンドポイント」にはすべてのREST引数が含まれており、serviceClient.sendReceive()メソッドでダミーのペイロード「<root></root>」を使用しています。

于 2011-11-07T10:43:49.497 に答える
0

これは、応答に時間がかかる可能性のあるバックエンドサービスを呼び出す企業のWebアプリケーションで気づきました。1つのホストへの接続が2つに制限されているため、Webアプリケーションがロックされます。

電話をかけるhttpConnectionManager.setParams( params ) に電話をかけますparams.setDefaultMaxConnectionsPerHost()httpConnectionManager.setParamsこれらの関数を逆の順序で呼び出して、関数自体の中でparamsの適用が行われないことを確認しましたか?

于 2009-11-24T17:19:37.410 に答える