System.exit 在 "sbt run" 中工作但不在 .jar 中工作

System.exit working in "sbt run" but not in .jar

当关闭我的程序时,我需要让我的 akka actor 在关闭之前完成他们正在做的事情,所以我有一个关闭钩子:

sys.addShutdownHook(
    {
      log.info("\n shutting down startWorkScheduler\n")
      assignWorkScheduler.cancel()
      log.info("\ntelling manager to shutdown gracefully\n")
      manager ! Manager.ShutdownGracefully
      //spam shutdown messages until we exit
      val resendShutDown = system.scheduler.schedule(5 seconds, 2 seconds){
        manager ! Manager.ShutdownGracefully
      }
      system.awaitTermination()
    }

我在其他地方等待 "all ok, you can shutdown" 消息:

case Terminated(httpDlrSqlRouter) => {
      println("received terminated message from http router")
      if(shuttingDown) {
        println("httpDlrRouter done, shutting down......")
        log.info("httpDlrRouter done, shutting down......")
        context.system.shutdown()
        java.lang.System.exit(0)
      }else{
        log.warning("httpDlrRouter terminated, don't know why!")
      }
    }

当我 运行 使用 sbt run 的代码时,它按预期工作:kill 或 CTRL+c 完成工作,打印 "httpDlrRouter done, shutting down......" 并退出。

当我使用 sbt assembly 构建 .jar 并使用 java -jar filename.jar 运行 时,它会做同样的事情 除了 实际上退出,它只是挂起,直到我用 kill -9

杀死它

我是否需要 System.exit 的任何替代方案或一些配置才能使其正常工作?

明显改变

java.lang.System.exit(0)

Runtime.getRuntime().halt(0)

解决了问题