Springboot关闭挂钩无法与Windows TaskKill一起使用

时间:2020-01-24 12:50:08

标签: java spring-boot apache-camel windows-services shutdown-hook

我有一个运行在Windows 10上的Apache Camel Spring Boot Java 8应用程序。当按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服务?我的应用程序的主类看起来像

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);
  }
}

1 个答案:

答案 0 :(得分:1)

来自Java Shutdown Hooks 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​​的信号。