Java进程的关闭挂钩不会在gradle守护进程中触发

时间:2014-03-26 20:06:22

标签: java gradle

我有一个套接字服务器应用程序。 当进程停止时,此应用程序关闭服务器并从标准Ja​​va关闭挂钩内部的端口解除绑定:

Runtime.getRuntime().addShutdownHook(new ShutdownHook());

我使用应用程序gradle插件从命令行运行它:

apply plugin: 'application'
mainClassName = "com.ServerLauncher"

但是当我从gradle运行应用程序时:

./gradlew :server:run

然后用ctrl + z关闭应用程序我的关闭挂钩不会触发。

我想这是因为gradle启动它自己启动java进程的进程,但看起来java进程没有收到关闭信号。

3 个答案:

答案 0 :(得分:2)

我找到了解决方案,为了防止这种行为,我需要说gradle不要运行它的守护程序线程传递这个命令行参数

./gradlew :server:run --no-daemon

答案 1 :(得分:1)

当前Gradle版本默认使用Gradle守护程序。实际发生的是,按Ctrl + C(我认为你的意思是它而不是Ctrl + Z)你不会终止你的应用程序,你终止整个Gradle过程。大约需要10秒钟。执行关闭挂钩,但有延迟,并且当Gradle与控制台输出断开连接时,您将看不到任何消息。

目前最简单的解决方法是添加--no-daemon开关。

Gradle建议使用增强功能来修复此行为。您可以投票赞成它:https://github.com/gradle/gradle/issues/1128

答案 2 :(得分:0)

最好继续使用守护进程,因为它提供了各种优势。

然后有一个可能的解决方案,通过发送TERM信号来真正停止您的应用程序,而不是停止启动其执行的Gradle进程。只需查看killjps(或简单ps)的文档。