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

时间:2015-07-31 08:23:10

标签: java scala jar akka sbt-assembly

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

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()
    }

和其他地方我等待“一切正常,你可以关机”的消息:

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完成,关闭......”并退出。

当我使用sbt assembly构建.jar并使用java -jar filename.jar运行它时,它会执行相同的除了实际退出,它只会挂起,直到我用{{1 }}

我是否需要kill -9或某些配置的替代方案才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

显然正在改变

java.lang.System.exit(0)

Runtime.getRuntime().halt(0)

解决了问题