[踩坑实录] spring-boot-maven-plugin + eclipse = This is a trap!

不行,我必须记录一下坑了我一下午的这个坑。

由于废话太多,先写一个brief版:

eclipse有一个2003年就发现至今没修复的bug:当在eclipse里调试程序时,点击console页面上的terminate的按钮,无法触发进程的shutdown hook方法,会造成子进程无法清理干净。(没仔细看,差不多这个意思)

spring-boot-maven-plugin 启动spring-boot application时,会先启动插件的process,再fork一个process来启动主程序。

当这两个事情碰到一起时,就出现了进程残留。

事情是这样的,在一个平静的下午,我在调试kafka消息收发,却发现我发出去的消息怎么都无法被我收到,打开kafka管理页面一看,哦豁,lag=0。

谁在抢我的消息?!算了,不和你争!我换topic,我换group,我自己跟自己玩!

如此启动程序了以后确实收到了消息,但是一次成功不算成功啊。果断又重启程序再次实验,居然又收不到消息了,lag=0,一模一样的现象。又有人在抢我的消息?! 理智告诉我这是不可能的,于是我跑去找了我们的principal engineer,发现其中一个broker挂了,但这与我何干啊!PE忙着了,我只得回来自己重新琢磨。。

琢磨了一会,怎么感觉是我自己抢了我自己的消息啊?

打开任务管理器,豁,十几个JAVE SE runtime进程在那,把我内存占到90%了。也是NB啊,我电脑咋没卡呢?果断杀进程![踩坑实录] spring-boot-maven-plugin + eclipse = This is a trap!

好吧,这下再启动程序,哦了,一切正常。忘记说了,我是再eclipse里调试的程序,所以关闭程序时只需要点控制台上一个红色terminate的按钮。

这个红色小按钮,我觉得它是要负责任的。证据就是我从power shell跑程序再ctrl+C结束程序时不会有进程残留。

所以这个按钮,到底有什么问题?一番搜索后找到了:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=38016

Bug 38016 - [README] java shutdown hooks are not invoked on exit

这个bug是什么时候提的呢?

Reported:

2003-05-23 04:14

掐指一算,至今已有17年!!!!eclipse这个bug!17年了!没有修复!!!!

[踩坑实录] spring-boot-maven-plugin + eclipse = This is a trap!

[踩坑实录] spring-boot-maven-plugin + eclipse = This is a trap!

[踩坑实录] spring-boot-maven-plugin + eclipse = This is a trap!

好了。。既然如此我就放心了。

不过我会踩进这个坑里也是个偶然了,我启动程序时使用了spring-boot-maven-plugin,所以这个plugin会先给自己启动一个javaw的进程,再去启动application的进程,从而符合bug中描述的从javaw进程启动java进程的场景,造成application进程残留。如果直接run as java 就不会有这个问题了。