springboot优雅停机的一种实现
定义一个事件监听器StopListenner
1.定义一个事件监听器StopListenner实现ApplicationListener
实现这个监听器的含义就是当应用环境准备就绪后执行指定的逻辑
2.设定一个AtomicBoolean 类型的原子变量用于向程序其他正在执行的线程等逻辑广播kill命令
3.在应用环境准备就绪的事件监听执行逻辑中Runtime.getRuntime().addShutdownHook(new Thread());
添加关闭钩子,在钩子线程中编写程序在完全关闭前你需要做的工作
下面展示我在kill命令执行后对线程池的关闭操作
@Component
public class StopListenner implements ApplicationListener<ApplicationReadyEvent> {
public static AtomicBoolean boolKilling = new AtomicBoolean(false);
@Autowired
@Qualifier("datasync_executor")
private ThreadPoolExecutor taskExecutor;
@Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
log.info("startup stopListener");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
log.info("listen quit signal");
boolKilling.set(true);
taskExecutor.shutdown();
try {
boolean flag = true;
do {
flag = !taskExecutor.awaitTermination(15000, TimeUnit.MILLISECONDS);
} while (flag);
} catch (InterruptedException e) {
// ...
}
log.info("start quit progress");
}));
}
}