IDEA终止程序时第三方库quartz源码断点无法触发是什么原因
问题原因分析
- IDEA默认停止按钮的触发逻辑导致调试连接提前断开
点击IDEA调试模式下的红色停止按钮时,会首先给目标JVM发送SIGINT终止信号,同时立刻断开调试器和JVM的socket连接,你日志中打印的Disconnected from the target VM记录就发生在这个阶段。而你断点所在的QuartzScheduler关闭逻辑属于Spring注册的JVM ShutdownHook逻辑,执行时机在调试连接断开之后,调试器已经无法接收断点触发信号,自然不会暂停程序。 - 断点代码的执行时机晚于调试连接断开节点
quartz 2.3.0版本中org.quartz.core.QuartzScheduler第585行属于调度器关闭流程的代码,是Spring容器销毁阶段由SpringApplicationShutdownHook线程触发执行的,你给出的日志也能明确看到顺序:调试断开日志在前,ShutdownHook执行的Quartz关闭相关日志在后,断点触发时调试链路已经失效。
额外补充:日志最终的退出码130也对应是SIGINT信号触发的进程终止,和上述逻辑完全匹配。
调试ShutdownHook逻辑的解决方案
如果需要调试调度器关闭相关的源码,不要直接点击停止按钮,推荐使用以下两种方案:
- 新增一个测试接口,手动注入
org.springframework.scheduling.quartz.SchedulerFactoryBean实例,调用其shutdown()方法主动触发Quartz调度器关闭流程,此时调试连接处于正常状态,断点可以正常生效。 - 修改IDEA调试配置:打开
File->Settings->Build, Execution, Deployment->Debugger,取消勾选Kill process immediately if it doesn't respond to termination request,部分版本IDEA可以通过该配置延迟断开调试连接,等ShutdownHook执行完成后再终止进程。
内容的提问来源于stack exchange,提问作者phantomsee
相关产品推荐
相关产品推荐

