停止应用
1 Web应用将HTTP流量切走
如果是Web应用,需要先借助工具或者命令,将登记在Nginx中的转发信息临时移除,确保不再有新的流量来访问将要停止的应用。
2 触发停止应用的通知
2.1 方式1-执行kill -2
发送进程停止信号,Java应用中通过Runtime.getRuntime().addShutdownHook注册回调,用于运行在进程退出前需要执行的逻辑。由于addShutdownHook可以注册多个回调,调用顺序并不明确,所以不是最佳方案,仅供参考。
2.2 方式2-通过访问指定url触发停止应用的操作
将应用改造为SpringBoot方式的应用,内置启动触发shutdown的EndPoint,其实就是提供一个指定的url,通过curl命令访问该url,然后在代码中运行在进程退出之前需要执行的逻辑。不是SpringBoot方式,只要是Web应用都可以这样做,注意这个url应该限制允许本地127.0.0.1的ip访问,且需要加上账号密码的鉴权限制,建议也限制仅允许POST方式访问。
举个例子,执行停止进程之前操作
output=$(curl -vvv -u ${USER}:${PASS} -X POST http://127.0.0.1:${SYS_PORT}${CONTEXT_PATH}/actuator/shutdown
echo "response is ${output}"
3 收到停止应用的通知后,应用内执行如下流程
3.1 关闭Spring Context之前,优先执行的操作
3.1.1 调用中间件停止监听的方法
根据应用中所使用的的中间件,调用相应停止监听的方法
3.1.2 调用内置Tomcat的停止连接方法
connector.pause();
3.1.3 调用其他按需实现的业务个性操作
比如某些重要的线程池需要提前执行shutdown并等待完全关闭,则需要逐个调用shutdonw方法。
如果有重要的定时任务在运行,比如跑批操作,需要自行实现优雅的stop或shutdown,便于进程重新启动后自动断点续作。
3.2 执行Spring ApplicationContext的close方法
context.close();
3.3 按需执行其他收尾工作
4 shell脚本轮训,检测应用绑定的JMX端口是否存在
如果端口存在,说明进程没有退出,shell sleep一秒,继续轮训
5 超过指定时间,强制kill
轮训检测超过指定时间,例如90s,进程仍未正常退出,则执行kill -9,强制终止进程,此方式为兜底方案,如果执行到此方式,建议排查进程不能及时终止的原因。
启动应用
1 检测进程是否存在
进程已经存在情况下,按照前面的流程先进性优雅的停止。
2 备份out文件
应用一般将标准输出流写到out文件,默认out文件没有按天滚动的机制,不停的追加,会导致文件越来越大,有些甚至几G甚至几十G,影响性能。因此需要将out文件重命名成带时间戳的备份文件,对于超过指定时间的备份out文件(比如超过3个月)自动删除。
3 调用启动应用的命令
4 shell脚本轮训,检测应用绑定的业务端口是否存在
如果端口存在,说明进程已经启动,否则shell sleep一秒,继续轮询。
5 访问指定url,触发应用的预热操作
轮询检测进程已经正常绑定服务端口,则curl访问指定url,触发应用加载缓存等预热操作,然后等待一定时间,比如5s
6 Web应用将HTTP流量切入
如果是Web应用,需要借助工具或者命令,将登记在Nginx中的转发信息进行恢复,确保有新的流量来访问已经就绪的应用。
7 超过指定时间,发出告警
轮训检测超过指定时间,比如150s,进程仍未正常绑定服务端口,则需要输出告警信息,用于监控分析。
最后
以上就是精明路灯最近收集整理的关于Java应用优雅启停执行步骤实践停止应用1 Web应用将HTTP流量切走2 触发停止应用的通知3 收到停止应用的通知后,应用内执行如下流程4 shell脚本轮训,检测应用绑定的JMX端口是否存在5 超过指定时间,强制kill启动应用1 检测进程是否存在2 备份out文件3 调用启动应用的命令4 shell脚本轮训,检测应用绑定的业务端口是否存在5 访问指定url,触发应用的预热操作6 Web应用将HTTP流量切入7 超过指定时间,发出告警的全部内容,更多相关Java应用优雅启停执行步骤实践停止应用1内容请搜索靠谱客的其他文章。
发表评论 取消回复