繁体   English   中英

Java 关闭挂钩未运行

[英]Java shutdown hook not running

我有一个 Java 产品服务。 在我们的代码中,我正在创建关闭挂钩,但是当我停止服务时,它并没有始终如一地调用关闭挂钩。 在 5 次停止调用中,它只调用了一次关闭挂钩。

Runnable shutdownHandler = new Runnable() {

    @Override
    public void run() {

        s_log.info("Shutting down thread..");
    }

};

Runtime.getRuntime().addShutdownHook(
        new Thread(shutdownHandler, "shutdownthread"));

任何人都可以告诉我这背后没有一直被调用的原因是什么?

检查以下代码:

Runnable shutdownHandler = new Runnable() {
    @Override
    public void run() {
        System.out.println("Shutting down thread..");
    }
};

Runtime.getRuntime().addShutdownHook(
        new Thread(shutdownHandler, "shutdownthread"));

如果它给了你预期的输出,你需要检查你的日志框架的文档。

我还发现我的框架 (Jooby) 和 Java 关闭挂钩在 IntelliJ 上的 Mac 上运行良好,它发送了一个 kill SIGINT (-2) 但是在 Ubuntu Server 20.04 LTS 上它们不运行。

由于我的 Java 应用程序是一个 web 应用程序,我想出了一个简单的解决方法:

  1. 设置一个控制器来监听一些不容易猜到的 url,例如

    /exit/fuuzfhuaBFDUWYEGLI823y82941u9y47t3u45
  2. 让控制器简单地执行以下操作:

     System.exit(0)

从脚本到 URL 执行 curl 或 wget 操作,当 JVM 关闭时,关闭钩子会全部触发。

我怀疑出于某种原因在 Linux 上存在一个错误,无论我使用什么中断,除了 SIGKILL 之外,它们都有效地表现得像 SIGKILL,并且 JVM 会硬/突然地停机。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM