当关闭我的程序时,我需要让我的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
或某些配置的替代方案才能使其正常工作?
答案 0 :(得分:1)
显然正在改变
java.lang.System.exit(0)
到
Runtime.getRuntime().halt(0)
解决了问题