我有以下Gradle任务
task bootup(type: JavaExec) {
dependsOn build
classpath = sourceSets.main.runtimeClasspath
main = 'org.example.ServerLauncher'
args 'hello'
maxHeapSize '512m'
}
并且类ServerLauncher.java
是
package org.example;
import java.util.concurrent.CountDownLatch;
public class ServerLauncher {
private final CountDownLatch shutdownHook;
private final String[] args;
private ServerLauncher(String[] args) {
this.args = args;
this.shutdownHook = new CountDownLatch(1);
}
public static void main(String[] args) throws Exception {
new ServerLauncher(args).execute();
}
private void execute() throws Exception {
hangShutdownHook();
System.out.println("Launcher has started");
try {
shutdownHook.await();
} finally {
System.out.println("Launcher has closed");
}
}
private void hangShutdownHook() {
Thread thread = new Thread(this::triggerShutdown);
Runtime.getRuntime().addShutdownHook(thread);
}
private void triggerShutdown() {
System.out.println("Shutdown has triggered");
shutdownHook.countDown();
}
}
当我构建Jar ./gradlew jar
并从cmd java -jar /path/to/exec
运行时,我可以使用CTRL+C
优雅地关闭可执行文件。
Launcher has started
^CShutdown has triggered
Launcher has closed
但是如果我运行./gradlew bootup
,我将无法通过CTRL+C
正常关闭可执行文件
> Task :bootup
Launcher has started
<===========--> 91% EXECUTING [8s]
> :bootup
^C%
如您所见,triggerShutdown
未执行。
我认为这是因为该过程是在JavaExec
期间分叉的
我试图向pid
发送各种终止信号,但仍然没有成功。
如何触发派生的Runtime的关闭钩子?
P.S:我不想更改java
代码中的逻辑。但是,我可以更改Gradle任务定义。