Seit einiger Zeit verwende ich HttpClient in einer Multithread-Umgebung. Wenn für jeden Thread eine Verbindung hergestellt wird, wird eine vollständig neue HttpClient-Instanz erstellt.
Kürzlich habe ich festgestellt, dass bei Verwendung dieses Ansatzes der Benutzer möglicherweise zu viele Ports geöffnet hat und sich die meisten Verbindungen im Status TIME_WAIT befinden.
http://www.opensubscriber.com/message/[email protected]/86045.html
Daher, anstatt dass jeder Thread Folgendes tut:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Wir planen:
[Methode A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
In einer normalen Situation wird von 50 ++ Threads gleichzeitig auf global_c zugegriffen. Ich habe mich gefragt, ob dies zu Leistungsproblemen führt. Verwendet MultiThreadedHttpConnectionManager einen sperrfreien Mechanismus, um seine thread-sichere Richtlinie zu implementieren?
Wenn 10 Threads global_c verwenden, werden die anderen 40 Threads gesperrt?
Oder wäre es besser, wenn ich in jedem Thread eine Instanz eines HttpClient erstelle, aber den Verbindungsmanager explizit freigebe?
[Methode B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Wird connman.shutdown () Leistungsprobleme haben?
Darf ich wissen, welche Methode (A oder B) für die Anwendung mit 50 ++ Threads besser ist?
quelle
Methode A wird von der httpclient-Entwicklergemeinde empfohlen.
Weitere Informationen finden Sie unter http://www.mail-archive.com/[email protected]/msg02455.html .
quelle
netstat
macht einen wirklich guten Job. technet.microsoft.com/en-us/sysinternals/bb897437.aspx auchIch habe in den Dokumenten gelesen, dass HttpConnection selbst nicht als threadsicher behandelt wird. Daher bietet MultiThreadedHttpConnectionManager einen wiederverwendbaren Pool von HttpConnections. Sie haben einen einzelnen MultiThreadedHttpConnectionManager, der von allen Threads gemeinsam genutzt und genau einmal initialisiert wird. Sie benötigen also ein paar kleine Verbesserungen an Option A.
Dann sollte jeder Thread die Sequenz für jede Anforderung verwenden, eine Verbindung aus dem Pool abrufen und sie nach Abschluss seiner Arbeit wieder zurücksetzen - die Verwendung eines finally-Blocks kann gut sein. Sie sollten auch die Möglichkeit codieren, dass für den Pool keine Verbindungen verfügbar sind, und die Timeout-Ausnahme verarbeiten.
Da Sie einen Pool von Verbindungen verwenden, werden die Verbindungen nicht geschlossen, sodass das Problem TIME_WAIT nicht auftreten sollte. Dieser Ansatz setzt voraus, dass nicht jeder Thread lange an der Verbindung festhält. Beachten Sie, dass Conman selbst offen bleibt.
quelle
Ich denke, Sie werden ThreadSafeClientConnManager verwenden wollen.
Sie können hier sehen, wie es funktioniert: http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html
Oder in der,
AndroidHttpClient
die es intern verwendet.quelle
Mit HttpClient 4.5 können Sie dies tun:
Beachten Sie, dass dieser Closeable implementiert (zum Herunterfahren des Verbindungsmanagers).
quelle