httpclient5使用

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");

            }
        }));
    }
}