SpringBoot 2.3.0 优雅关闭 shutdown graceful
后记
写完篇文章后就把项目升级了该功能 ,但是上线后发现 kill-2 xxx关闭不了,没有反应 ,直接kill xxx 可以 。
缘起
最近看到Springboot 新版有了 优雅关闭的新特性,于是学习验证了下
学习
很简单 ,在application.yml 中配置 server.shutdown=graceful即可 ,启用该选项,web容器在关闭时会有始有终的处理完已经接收到的请求,注意,此时新的请求已经无法接收了。
验证
创建demo程序
创建一个SpringBoot web项目 ,注意版本要在2.3.0及以上 ,启动参数模拟版本号,
然后创建一个接口,接收一个字符串参数 ,sleep30秒,最后返回版本号和用户传来的参数。
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Resource
private ApplicationArguments arguments;
@RequestMapping("/show/{str}")
public Object test(@PathVariable("str") String str) throws InterruptedException {
List<String> version = arguments.getNonOptionArgs();
System.out.println("[start] - > " + version.get(0) +"--" +str);
Thread.sleep(30 * 1000L);
System.out.println("[end] - > " + version.get(0) + "--" + str);
return version.get(0) +"--" +str;
}
}
打包启动
打包好程序fe.jar ,使用命令启动: java -jar fe.jar v1 --server.port=8123
然后用浏览器访问这个接口 http://192.168.1.22:8123/show/tom
关闭它
在30秒之内关闭它 ,使用kill -2 xxx 命令 (注意这里一定不能用-9,会直接少杀死它)。程序收到kill命令 ,控制台立马打印出了 [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
这行消息。直到处理完来自tom的请求。
在它还没完全关闭时,其实我也发了一些请求过来,都直接失败了。
验证还没完全关闭时,启动新版能否成功
写了个shell脚本,用来关闭监听8123的进程 ,然后立马启动新版程序;
#!/bin/sh
QYPATH="/home/testiron"
chmod 777 $QYPATH/fe.jar
# 关闭V1
VID=`ps -ef|grep java|grep 8123|awk '{print $2}'`
echo "\n关闭备用服务"
if [ -n "$VID" ]
then
for i in $V7D;
do kill -2 $i
echo "kill $i done";
done
fi
# 启动V2
java -jar /home/testiron/fe.jar v2 --server.port=8123
发现是可以启动的,不会出现端口占用的问题。
思考
因为以前写.net ,所以去了解了下.net core 单文件发布的情况下,有没有相应的解决方案 ,不过没有找到 ,这里抛砖引玉下 。
转载请遵循此协议:署名 - 非商业用途 - 保持一致
并保留此链接:http://fejerry.cnblogs.com/