"Time out", wenn multithreading-Anfragen an einen webservice mit java und axis2

Arbeite ich mit einem langsamen webservice (etwa 4 Minuten pro Antrag) und ich müssen noch über 100 Anfragen in zwei Stunden, also habe ich beschlossen, die Verwendung mehrerer threads. Das problem ist, dass ich nur 2 threads, da der stub lehnt alle anderen. Hier Ich habe eine Erklärung gefunden und eine mögliche Lösung:

Ich hatte das gleiche problem. Es scheint, dass
die Quelle davon ist
defaultMaxConnectionsPerHost Wert in
MultiThreadedHttpConnectionManager
gleich 2 ist. Workaround für mich war
erstellen Sie Ihre eigene Instanz von
MultiThreadedHttpConnectionManager und
verwenden Sie es in service-stub, so etwas wie
im Beispiel unten

Ich habe getan, was der Autor sagte, und ging ein HttpClient um die stub mit höheren setMaxTotalConnections und setDefaultMaxConnectionsPerHost Werte, aber das problem ist, dass jetzt die Anwendung nicht mehr reagiert (gut, es ist nicht wirklich friert, aber Es tut sich nix).

Das ist mein code:

 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;
}

Dann habe ich pass, die stub-und die Anfrage an die jeweils einer der Fäden, und führen Sie Sie. Wenn ich nicht die HttpClient und verwenden Sie die Standardeinstellung, nur zwei threads ausführen, und wenn ich es einrichten, funktioniert die Anwendung nicht. Irgendeine Idee?

  • Wenn man sich einen thread dump aus, was sind alle diese threads zu tun? (Zum Beispiel, wenn Sie das Debuggen des Clients unter Eclipse, gehen Sie auf die Debug-Perspektive und das anhalten aller threads, dann klicken Sie auf jeder, um zu sehen, was es an.)
  • Auch ich werde es versuchen, weil in diesem moment ich don ' T wirklich verstehen, warum Sie hängen.
InformationsquelleAutor Sergi | 2009-11-24
Schreibe einen Kommentar