怎么写代码才能让 springboot 应用进程停止啊

2021 年 2 月 19 日
 luxinfl

当应用启动时,如果端口号被占用,程序会报错,但是 idea 上项目还是运行的状态。因为在端口占用前,应用起了几个线程去跑其他任务,导致应用没有正常关闭。有比较靠谱的方法可以让程序正常停止么? 有想过

try {
    SpringApplication.run(ClcsApplication.class, args);
}catch (Exception e){
    System.exit(0);
}

但是不建议使用。 也想过

MyApplicationRunner implements ApplicationListener<ApplicationFailedEvent>

但是需要一个个的关闭线程,而且还不一定好用。

3972 次点击
所在节点    程序员
21 条回复
sutra
2021 年 2 月 20 日
你得先讓自己啟的那幾個線程終止呀。
cslive
2021 年 2 月 20 日
windows 下打开命令窗口运行 taskkill /f /im java.exe
yalin
2021 年 2 月 20 日
kill 进程?
wbf1013
2021 年 2 月 20 日
其他线程只要是在 spring 的生命周期里就可以了,主线程挂了就全挂了
Kinnice
2021 年 2 月 20 日
可以试试在最前面加个启动环境检测,检测不过就不往下走了(
luxinfl
2021 年 2 月 20 日
@cslive
@yalin 我是在想程序怎么处理,不用服务器敲命令
luxinfl
2021 年 2 月 20 日
@wbf1013
@Kinnice
我现在把几个 kafka 的 bean 延迟启动了,但是不知道为啥,端口号被占用报错,程序还是不能正常停止。看了 dump 信息有好多线程在 waiting
MapHacker
2021 年 2 月 20 日
代码里面直接 killProcess ?
luxinfl
2021 年 2 月 20 日
@MapHacker 这个和直接 System.exit 一样吧,
ThisDay
2021 年 2 月 20 日
打成 jar 包运行的时候会全部退出,但是在 idea 里面不会,不知道为什么
yumenawei
2021 年 2 月 20 日
Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("Hello world !")));
试下这个?
intmax2147483647
2021 年 2 月 20 日
为什么不从根本上解决问题 -> 端口冲突?
devld
2021 年 2 月 20 日
启动的几个子线程的任务中实现 DisposableBean,在回调中终止任务。
wzcloud
2021 年 2 月 20 日
监听应用关闭事件,然后主动关闭线程;或者把那几个现场设置成守护线程?
luxinfl
2021 年 2 月 20 日
@intmax2147483647 测试提出来的,没办法。而且吧端口号不能用,程序不应该退出麽。。
luxinfl
2021 年 2 月 20 日
@devld 像异步线程池这个,日志就是 shutting down,这意思是不是一直在停止。。。
luxinfl
2021 年 2 月 20 日
@wzcloud 怎么主动关线程,这个真不会。。。
Kasumi20
2021 年 2 月 20 日
中断其它线程,其它线程通过 Thread.sleep(0)响应中断异常
luxinfl
2021 年 2 月 20 日
@Kasumi20 这不用搞个 while 循环麽?
newmlp
2021 年 2 月 20 日
kill -9

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/754423

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX