有一天,我在我的应用程序中实现了一项重要的服务,无论如何它都应该继续运行。所以我使用了以下构造:
ScheduledExecutorService ses =
Executors.newSingleThreadScheduledExecutor();
//If the thread dies, another will take over
ses.scheduleAtFixedRate(importantPeriodicTask, 1, 1, TimeUnit.NANOSECONDS);
...只是发现当 importantPeriodicTask 实际上抛出 RuntimeException 或 Error 时,ScheduledExecutorService
将停止执行此任务(它们将停止被安排)。
这当然正是 javadoc 所说的:
如果有任务执行
遇到异常,后续
处决受到压制。
我很羞耻,但我不明白为什么作者要实施ScheduledExecutorService
像这样。
当然,一般不应捕获 RuntimeException 或 Error,尤其是 Error。但实际上,特别是在 RuntimeException 的情况下,事实是它们在生产部署中很常见,而且我觉得几乎总是希望虽然特定操作应该失败,但应用程序本身不应该因为孤立的错误而失败。
确实,抑制一种周期性任务不会影响其他类型的周期性任务。但考虑到大多数周期性任务的性质,这些任务难道不应该被视为“服务”,而不是孤立的任务吗?
换句话说,不应该只有这一个实例importantPeriodicTask
失败了,任务本身是否要继续重新安排?
我认为目前的行为是合理的。 RuntimeExceptions通常指的是错误。它们实际上可以出现在任务代码中的任何位置。例如,如果任务是有状态的,则它可能会使其状态不一致,并且后续执行将出现意外行为。一般来说,我不喜欢试图从自身错误中恢复的代码,但这是我的观点。
如果您希望更改 ScheduledExecutorService 的行为,请查看以下通用解决方案:
http://www.javaspecialists.eu/archive/Issue154.html http://www.javaspecialists.eu/archive/Issue154.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)