最近项目维护过程中,商户在使用我们对外提供的java sdk的时候,发现应用进行正常停止的时候,不正常停止,从日志中分析发现,sdk内的定时关闭http连接方法无法正常退出,代码片段如下:
private final static ScheduledThreadPoolExecutor SCHEDULED = new ScheduledThreadPoolExecutor(1);
/**
* 定时清理空闲连接,延迟1分钟启动,每5秒清理超过30秒空闲的连接
* @param cm http连接池管理器
*/
private static void cleanConnections(final PoolingHttpClientConnectionManager cm) {
SCHEDULED.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (cm != null) {
cm.closeExpiredConnections();
cm.closeIdleConnections(30, TimeUnit.SECONDS);
}
}
}, 60, 5, TimeUnit.SECONDS);
}
针对该问题,可实现注册钩子实现,优雅关闭线程池,代码示例如下:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
SCHEDULED.shutdown();
}));
其中线程池shutdown原理参考博客:https://editor.csdn.net/md/?articleId=108894057