# spring boot 服务优雅停机 ## 方法一:使用kill 而不是kill -9 ### kill kill 对应的是kill -15 ,kill 程序时有以下特点 * 系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情 * 程序立刻停止 * 当程序释放相应资源后再停止 * 程序可能仍然继续运行 * 大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出相应。也就是说,SIGTERM多半是会被阻塞的、忽略 ### kill -9 强制停止命令 ## 方法二:spring actuator 开放`shutdown`endpoint,通过发送向该endpoint发送http请求来停机. `curl -X Post localhost:8080/actuator/shutdown` ## amazon-subscription优雅停机方案 amazon-subscription在监控amazon aws消息队列, 消费后生成的数据会保存到clickhouse中, 但是由于clickhouse最高只支持100个并发,所以需要批量插入数据. 数据会缓存在内存中, 定时向clickhouse插入. 当服务被kill时, 如果内存中的数据不能被及时写入到clickhouse, 就会永远丢失. 解决方案如下: * 使用优雅停机, 保证服务在关闭前,有时间进行处理. * 监听spring事件`ContextClosedEvent`, 关闭listener, 再把缓存中的数据写入到clickhouse.