# 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.
