In meinem Test-Anwendung ausführen ich in Folge HttpGet auf dem gleichen Host anfordert mit Apache Httpclient aber bei jedem nächsten Anforderung wird es stellt sich heraus, dass der vorherige Httpconnection geschlossen und der neue Httpconnection erstellt.Wie erhält man persistente HttpConnection mit Apache HttpClient?
Ich benutze die gleiche Instanz von HttpClient und schließen keine Antworten. Von jeder Entität erhalte ich InputStream, lese mit Scanner und schließe dann den Scanner. Ich habe KeepAliveStrategy getestet, es gibt True zurück. Die Zeit zwischen Anforderungen überschreitet nicht die Dauer von keepAlive oder connectionTimeToLive.
Kann mir jemand sagen, was könnte der Grund für ein solches Verhalten sein?
Aktualisiert
ich die Lösung gefunden zu haben. Um das HttpConnecton am Leben zu erhalten, ist es notwendig HttpClientConnectionManager beim Aufbau von HttpClient zu setzen. Ich habe BasicHttpClientConnectionManager verwendet.
ConnectionKeepAliveStrategy keepAliveStrat = new DefaultConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context)
{
long keepAlive = super.getKeepAliveDuration(response, context);
if (keepAlive == -1)
keepAlive = 120000;
return keepAlive;
}
};
HttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager();
try (CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager) // without this setting connection is not kept alive
.setDefaultCookieStore(store)
.setKeepAliveStrategy(keepAliveStrat)
.setConnectionTimeToLive(120, TimeUnit.SECONDS)
.setUserAgent(USER_AGENT)
.build())
{
HttpClientContext context = new HttpClientContext();
RequestConfig config = RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT)
.setSocketTimeout(10000)
.setConnectTimeout(10000)
.build();
context.setRequestConfig(config);
HttpGet httpGet = new HttpGet(uri);
CloseableHttpResponse response = httpClient.execute(httpGet, context);
HttpConnection conn = context.getConnection();
HttpEntity entity = response.getEntity();
try (Scanner in = new Scanner(entity.getContent(), ENC))
{
// do something
}
System.out.println("open=" + conn.isOpen()); // now open=true
HttpGet httpGet2 = new HttpGet(uri2); // on the same host with other path
// and so on
}
2 Aktualisiert
Im allgemeinen Überprüfung Verbindungen mit conn.isOpen()
nicht richtige Weg ist, weil die Verbindungen Zustand zu überprüfen: „Intern HTTP-Verbindungs-Manager mit Instanzen von ManagedHttpClientConnection arbeiten als Proxy für einen echten handeln Verbindung, die den Verbindungsstatus verwaltet und die Ausführung von E/A-Vorgängen steuert Wenn eine verwaltete Verbindung freigegeben oder vom Benutzer explizit geschlossen wird, wird die zugrunde liegende Verbindung von ihrem Proxy getrennt und an den Manager zurückgegeben Ich habe einen Verweis auf die Proxy-Instanz, es ist nicht mehr in der Lage, irgendwelche E/A-Operationen auszuführen oder den Zustand der realen Verbindung entweder absichtlich oder unabsichtlich zu ändern. " (HttpClent Tutorial)
Wie schon @oleg gezeigt, ist der richtige Weg, Verbindungen zu verfolgen, die logger.
Können Sie uns Code zeigen? – inovaovao
Ja. Ich habe diesen Code hinzugefügt. – snptc