blob: ddb473d348cb585f6e082a0847531ba86b93af94 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
package com.yahoo.vespa.hosted.node.admin.util;
import com.yahoo.log.LogLevel;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import java.io.IOException;
import java.util.logging.Logger;
/**
* @author freva
*/
class SelfCloseableHttpClient implements AutoCloseable {
private static final Logger log = Logger.getLogger(SelfCloseableHttpClient.class.getName());
private final CloseableHttpClient httpClient;
SelfCloseableHttpClient() {
this(SSLConnectionSocketFactory.getSocketFactory());
}
SelfCloseableHttpClient(SSLConnectionSocketFactory sslConnectionSocketFactory) {
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
cm.setMaxTotal(200); // Increase max total connections to 200, which should be enough
// Have experienced hang in socket read, which may have been because of
// system defaults, therefore set explicit timeouts. Set arbitrarily to
// 15s > 10s used by Orchestrator lock timeout.
int timeoutMs = 15_000;
RequestConfig requestBuilder = RequestConfig.custom()
.setConnectTimeout(timeoutMs) // establishment of connection
.setConnectionRequestTimeout(timeoutMs) // connection from connection manager
.setSocketTimeout(timeoutMs) // waiting for data
.build();
this.httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestBuilder)
.disableAutomaticRetries()
.setUserAgent("node-admin")
.setConnectionManager(cm).build();
}
public CloseableHttpResponse execute(HttpUriRequest request) throws IOException {
return httpClient.execute(request);
}
@Override
public void finalize() throws Throwable {
close();
super.finalize();
}
@Override
public void close() {
try {
httpClient.close();
} catch (Exception e) {
log.log(LogLevel.WARNING, "Ignoring exception thrown when closing http client", e);
}
}
}
|