httpclient5使用
httpclientUtil
public class HttpClientUtil {
private CloseableHttpClient client;
private PoolCleaner pc;
private static HttpClientUtil util = new HttpClientUtil();
private HttpClientUtil() {
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(6000);
connManager.setDefaultMaxPerRoute(500);
RequestConfig.Builder custom = RequestConfig.custom();
custom.setConnectTimeout(Timeout.of(30, TimeUnit.SECONDS));
custom.setConnectionRequestTimeout(Timeout.of(7, TimeUnit.SECONDS));
custom.setResponseTimeout(5,TimeUnit.SECONDS);
RequestConfig config = custom.build();
client = HttpClients.custom()
.setRetryStrategy(new ToHttpRequestRetryStrategy())
.setDefaultRequestConfig(config)
.setConnectionManager(connManager)
.build();
pc = new PoolCleaner(connManager);
new Thread(pc,"pc-cleaner").start();
}
public static HttpClientUtil getInstance() {
return util;
}
public void close() {
pc.shutdown();
}
public HttpClient getClient() {
return client;
}
@Slf4j
static class PoolCleaner implements Runnable {
private PoolingHttpClientConnectionManager pcm;
private volatile boolean running = true;
public PoolCleaner(PoolingHttpClientConnectionManager pcm) {
this.pcm = pcm;
}
@Override
public void run() {
log.info("start cleaner....");
while (running) {
synchronized (pcm) {
try {
pcm.wait(1000);
} catch (InterruptedException e) {
log.info("close interrupter");
}
pcm.closeExpired();
pcm.closeIdle(TimeValue.of(30, TimeUnit.SECONDS));
}
}
log.info("{} end clean", Thread.currentThread().getName());
}
public void shutdown() {
synchronized (pcm) {
running = false;
pcm.notifyAll();
}
}
}
}
启动加载
@Slf4j
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
HttpClientUtil.getInstance();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
HttpClientUtil.getInstance().close();
log.info("close pc cleaner");
}
}));
}
}