如果线程成功,注销sys.ShutdownHookThread?
Unregister sys.ShutdownHookThread if thread is successful?
我在 Scala 2.11
中有一个 Future
,它由 Akka 中的工人 actor 控制。 Future 由 worker 执行,worker 向中央 actor 报告 success/failure 并请求更多工作。
worker 处理的期货是 long-运行,根据任务的复杂性,计算最多可能需要 15 分钟才能完成。有 100% 的机会在计算中期进行部署,我将让它崩溃。但是,我确实需要做一些非常小的清理工作,所以我在未来自己实现了以下 sys.ShutdownHookThread
:
sys.ShutdownHookThread {
logger.info(s"Computation was killed mid-task for user ${set.userId}. Recovering state...")
closeProcessingState
}
我的问题是这样的:如果我已经注册了一个关闭钩子,它会在 future 完成后自行注销吗?检查 API 文档,描述说它是 "self-unregistering" 但它似乎没有说明是什么原因导致它自行注销。
基本上,如果 JVM 在数小时后关闭,我不想要一千个关闭挂钩 运行,因为它们不会自动注销。
文档没有说它是 "self-unregistering"。它说:It knows how to unregister itself.
。这意味着您可以在 ShutdownHookThread
.
的实例中调用方法 remove
这个ShutdownHookThread
只是java.lang.Runtime#addShutdownHook. Have a look at the implementation it's quite simple的帮手。
换句话说,您有责任取消注册。
我在 Scala 2.11
中有一个 Future
,它由 Akka 中的工人 actor 控制。 Future 由 worker 执行,worker 向中央 actor 报告 success/failure 并请求更多工作。
worker 处理的期货是 long-运行,根据任务的复杂性,计算最多可能需要 15 分钟才能完成。有 100% 的机会在计算中期进行部署,我将让它崩溃。但是,我确实需要做一些非常小的清理工作,所以我在未来自己实现了以下 sys.ShutdownHookThread
:
sys.ShutdownHookThread {
logger.info(s"Computation was killed mid-task for user ${set.userId}. Recovering state...")
closeProcessingState
}
我的问题是这样的:如果我已经注册了一个关闭钩子,它会在 future 完成后自行注销吗?检查 API 文档,描述说它是 "self-unregistering" 但它似乎没有说明是什么原因导致它自行注销。
基本上,如果 JVM 在数小时后关闭,我不想要一千个关闭挂钩 运行,因为它们不会自动注销。
文档没有说它是 "self-unregistering"。它说:It knows how to unregister itself.
。这意味着您可以在 ShutdownHookThread
.
remove
这个ShutdownHookThread
只是java.lang.Runtime#addShutdownHook. Have a look at the implementation it's quite simple的帮手。
换句话说,您有责任取消注册。