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​​ 的信号。