2014-02-06 10 views
6

Ich habe Probleme, die Apache Httpclient bekommen (4.3) Post-Anforderung mit dem folgenden Code Timeout:Apache Httpclient 4.3 nicht Timeout

RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(4000).setConnectTimeout(4000) 
     .setSocketTimeout(4000).build(); 

CloseableHttpClient client = HttpClients.custom().setSslcontext(sslContext) 
     .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) 
     .setDefaultRequestConfig(requestConfig).build(); 

HttpPost post = new HttpPost("https://localhost:" + connection.getLocalPort() + "/API/webservice.asmx"); 

StringEntity stringE = new StringEntity(REQUEST); 
    post.setEntity(stringE); 

CloseableHttpResponse response = client.execute(post); 

Ich erhalte die Verbindung und Anschluss über eine proprietäre API. Wenn alles gut geht funktioniert das aber manchmal (wegen einer schlechten Verbindung glaube ich) der Code bleibt für immer bei client.execute (post) hängen. Gibt es etwas, das ich hier falsch mache, wenn ich das Timeout oder eine andere Methode implementiere, um den Anruf zu unterbrechen, damit ich nicht auf unbestimmte Zeit feststecke?

Antwort

5

Dies ist ein Fehler mit HTTPS-Verbindungen in HttpClient 4.3. Das Socket-Timeout wird nicht auf dem Socket festgelegt, bevor der SSL-Handshake versucht wird. Der Thread kann während des Handshakes warten, während der Socket gelesen wird. HttpClient 4.2 hat diesen Fehler nicht.

+2

Als Referenz (es scheint in 4.3.4 behoben sein): https://issues.apache.org/jira/browse/HTTPCLIENT-1478 – Greg

+2

Bitte beachten Sie, dass es tatsächlich in 4.3.4/4.3 behoben scheint. 5 bei der Verbindung über SSL/HTTPS. – centic

+1

Wenn Sie den HTTPCLIENT-1478 vollständig lesen, werden Sie sehen, dass sich mehrere Personen beschweren, dass es nicht wirklich behoben ist. Ich benutze 4.4.1 und ich kann bestätigen, dass dieses Problem immer noch auftritt. – GaspardP

Verwandte Themen