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 单文件发布的情况下,有没有相应的解决方案 ,不过没有找到 ,这里抛砖引玉下 。

posted @ 2020-11-25 13:20  地菜  阅读(803)  评论(0编辑  收藏  举报