"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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bemerkte dies in einem corporate-web-Anwendung, genannt back-end-Dienst, könnte eine lange Zeit, um zu reagieren. Die web-Anwendung sperren, weil ein limit von 2 verbindungen zu einem einzelnen host nehmen würde halten.
Rufen Sie
httpConnectionManager.setParams( params )
vor rufen Sieparams.setDefaultMaxConnectionsPerHost()
. Haben Sie versucht, den Aufruf dieser Funktionen in umgekehrter Reihenfolge, um zu bestätigen, dass die Anwendung der Parameter nicht innerhalb derhttpConnectionManager.setParams
Funktion selbst?getParams
auf der connection-manager-Objekt und dann gehen Sie über änderungen an diesem Objekt. Als Behauptung könnten Sie überprüfen, dass das Objekt, die du mitsetParams()
ist das gleiche wie das Objekt, das Sie sind zurückgekehrt von dergetParams()
Funktion?Wenn jemand will, um zu erstellen, eine dynamische REST-client in WSO2 Axis2, den folgenden code funktionierte für mich...
Ich die Max Connections auf 20 und den Timeout auf 20 Sekunden.
Auch mein "Endpunkt") enthält alle ÜBRIGEN Argumente, ich bin nur mit einer dummy-Nutzlast "<root></root>" in der serviceClient."sendReceive" () - Methode.