gpt4 book ai didi

java - 如果任务抛出 RuntimeException/Error,ScheduledExecutorService.scheduleAt* 方法是否应该重新安排任务?

转载 作者:行者123 更新时间:2023-12-04 06:49:38 25 4
gpt4 key购买 nike

前几天我在我的应用程序中实现了一个重要的服务,无论如何它都应该继续运行。所以我使用了以下结构:

ScheduledExecutorService ses =
Executors.newSingleThreadScheduledExecutor();

//If the thread dies, another will take over
ses.scheduleAtFixedRate(importantPeriodicTask, 1, 1, TimeUnit.NANOSECONDS);

...只是发现当 importantPeriodicTask 实际抛出 RuntimeException 或 Error 时, ScheduledExecutorService将停止执行此任务(它们将不再被安排)。

这当然正是 javadoc 所说的:

If any execution of the task encounters an exception, subsequent executions are suppressed.



我真丢脸,但我不明白作者为什么实现 ScheduledExecutorService像这样。

当然,通常不应捕获 RuntimeException 或 Error,尤其是 Error。但在现实中,尤其是在 RuntimeException 的情况下,事实是它们在生产部署中很常见,我觉得几乎总是可取的,虽然该特定操作应该失败,但应用程序本身不应该因为那个孤立的错误而失败。

确实,抑制一个周期任务不会影响其他类型的周期任务。但考虑到大多数周期性任务的性质,这些任务不应该被视为“服务”,而不是孤立的任务吗?

换句话说,不应该只有 importantPeriodicTask 的一个实例。失败,任务本身是否继续被重新安排?

最佳答案

在我看来,目前的行为是合理的。 RuntimeExceptions 通常是指错误。它们实际上可以出现在任务代码的任何地方。例如,如果任务是有状态的,它可能会使其状态不一致,并且后续执行将出现意外行为。一般来说,我不喜欢试图从自身错误中恢复的代码,但这是我的看法。

如果您希望更改 ScheduledExecutorService 的行为,请查看以下通用解决方案:

http://www.javaspecialists.eu/archive/Issue154.html

关于java - 如果任务抛出 RuntimeException/Error,ScheduledExecutorService.scheduleAt* 方法是否应该重新安排任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3308977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com