我有一个套接字服务器应用程序。 当进程停止时,此应用程序关闭服务器并从标准Java关闭挂钩内部的端口解除绑定:
Runtime.getRuntime().addShutdownHook(new ShutdownHook());
我使用应用程序gradle插件从命令行运行它:
apply plugin: 'application'
mainClassName = "com.ServerLauncher"
但是当我从gradle运行应用程序时:
./gradlew :server:run
然后用ctrl + z关闭应用程序我的关闭挂钩不会触发。
我想这是因为gradle启动它自己启动java进程的进程,但看起来java进程没有收到关闭信号。
答案 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进程。只需查看kill
和jps
(或简单ps
)的文档。