【发布时间】:2020-06-17 21:49:38
【问题描述】:
下面是我的ApacheHttpClient Spring bean,我想知道我的配置是否适合生产,还是我需要调整任何配置?如果您在生产中使用最新的 Apache Http 客户端,有人可以分享一些信息吗
@Service
public class ApacheHttpClient implements IHttpClient {
private static final Logger LOGGER = Logger
.getInstance(ApacheHttpClient.class);
private static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 400;
private static final int DEFAULT_IDLE_CONNECTION_EVICTION_FREQUENCY_SECONDS = 300;
private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = DEFAULT_MAX_TOTAL_CONNECTIONS;
private static final int DEFAULT_CONNECTION_TIMEOUT_MILLISECONDS = (60 * 1000);
private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = (4 * 60 * 1000);
private static final int DEFAULT_WAIT_TIMEOUT_MILLISECONDS = (60 * 1000);
private static final int DEFAULT_VALIDATE_AFTER_INACTIVITY_MILLISECONDS = (5 * 60 * 1000);
private static final int DEFAULT_KEEP_ALIVE_MILLISECONDS = (5 * 60 * 1000);
private static final int DEFAULT_REQUEST_RETRY = 2;
@Autowired
private SSLContextHelper customSSLContext;
private int keepAlive = DEFAULT_KEEP_ALIVE_MILLISECONDS;
private int maxTotalConnections = DEFAULT_MAX_TOTAL_CONNECTIONS;
private int maxConnectionsPerRoute = DEFAULT_MAX_CONNECTIONS_PER_ROUTE;
private int connectTimeout = DEFAULT_CONNECTION_TIMEOUT_MILLISECONDS;
private int readTimeout = DEFAULT_READ_TIMEOUT_MILLISECONDS;
private int waitTimeout = DEFAULT_WAIT_TIMEOUT_MILLISECONDS;
private int requestRetry = DEFAULT_REQUEST_RETRY;
private CloseableHttpClient httpClient;
private ConnectionKeepAliveStrategy keepAliveStrategy = (response,
context) -> {
HeaderElementIterator it = new BasicHeaderElementIterator(
response.headerIterator(
HTTP.CONN_KEEP_ALIVE));
while (it
.hasNext()) {
HeaderElement he = it
.nextElement();
String param = he
.getName();
String value = he
.getValue();
if (value != null
&& param.equalsIgnoreCase(
"timeout")) {
try {
return Long
.parseLong(
value)
* 1000;
} catch (NumberFormatException ignore) {}
}
}
return keepAlive;
};
@PostConstruct
public void initializeApacheHttpClient() {
// config timeout
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(waitTimeout)
.setSocketTimeout(readTimeout).build();
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(customSSLContext.getSSLContext())).build();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connManager.setMaxTotal(maxTotalConnections);
// Increase default max connection per route
connManager.setDefaultMaxPerRoute(maxConnectionsPerRoute);
// Defines period of inactivity in milliseconds after which persistent connections must be re-validated prior to
// being reused
connManager.setValidateAfterInactivity(DEFAULT_VALIDATE_AFTER_INACTIVITY_MILLISECONDS);
httpClient = HttpClients.custom().setKeepAliveStrategy(keepAliveStrategy).setConnectionManager(connManager)
.setConnectionManagerShared(true).setSSLContext(customSSLContext.getSSLContext())
.setDefaultRequestConfig(config)
.setRetryHandler(new DefaultHttpRequestRetryHandler(requestRetry, true))
.build();
// detect idle and expired connections and close them
IdleConnectionEvictor staleMonitor = new IdleConnectionEvictor(connManager, DEFAULT_IDLE_CONNECTION_EVICTION_FREQUENCY_SECONDS);
staleMonitor.start();
LOGGER.log(Level.INFO, "Initialize ApacheHttpClient is successful");
}
}
【问题讨论】:
标签: java spring apache-httpclient-4.x apache-httpcomponents