Springboot 关闭挂钩不适用于 Windows TaskKill
Springboot shutdown hook not working with Windows TaskKill
我有一个 Apache Camel Spring Boot Java 8 应用程序在 Windows 10 上运行。按下 CTRL-C 时它会正常关闭,尽管有时我必须按下它两次。但是当使用 TaskKill 时,答案总是
C:\Windows\system32>taskkill /PID 1048
ERROR: The process with PID 1048 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).
我的目标是创建一个 Windows 服务,但是再次停止该服务时,该应用程序突然终止。为什么 CTRL-C 有效,而 TaskKill 无效?我该怎么做才能使 Windows 服务正常关闭?我的应用程序的主要 class 看起来像
import org.apache.camel.spring.Main;
@SpringBootApplication
@EnableScheduling
public class InformerApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(InformerApplication.class, new String[0]);
Main.main( args);
}
}
来自 Java 关闭挂钩 API
Java 虚拟机响应两种事件而关闭:
- 程序正常退出,当最后一个非守护线程退出或者调用exit(等价的,System.exit)方法时
- 虚拟机响应用户中断而终止,例如键入 CTRL+C (SIGINT),或系统范围的事件,例如用户注销或系统关闭。
https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)
WM_CLOSE 未处理来自 KillTask 的信号。
我有一个 Apache Camel Spring Boot Java 8 应用程序在 Windows 10 上运行。按下 CTRL-C 时它会正常关闭,尽管有时我必须按下它两次。但是当使用 TaskKill 时,答案总是
C:\Windows\system32>taskkill /PID 1048
ERROR: The process with PID 1048 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).
我的目标是创建一个 Windows 服务,但是再次停止该服务时,该应用程序突然终止。为什么 CTRL-C 有效,而 TaskKill 无效?我该怎么做才能使 Windows 服务正常关闭?我的应用程序的主要 class 看起来像
import org.apache.camel.spring.Main;
@SpringBootApplication
@EnableScheduling
public class InformerApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(InformerApplication.class, new String[0]);
Main.main( args);
}
}
来自 Java 关闭挂钩 API
Java 虚拟机响应两种事件而关闭:
- 程序正常退出,当最后一个非守护线程退出或者调用exit(等价的,System.exit)方法时
- 虚拟机响应用户中断而终止,例如键入 CTRL+C (SIGINT),或系统范围的事件,例如用户注销或系统关闭。
https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)
WM_CLOSE 未处理来自 KillTask 的信号。