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

2024-02-01

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

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(使用前将#替换为@)

如果任务抛出 RuntimeException/Error,ScheduledExecutorService.scheduleAt* 方法是否应该重新安排任务? 的相关文章

随机推荐

  • 调整制表符行高

    我正在尝试调整制表器表格上的表格行高度 我正在尝试使行更高 以便更容易与触摸屏设备上的用户进行交互 我在文档中没有找到任何内容 并且我还没有成功调整CSS 使行更高的正确方法是什么 我正在尝试使用 Apple 建议的最小 44 像素 您可以
  • 如何使用 Hibernate 连接两个表的字段?

    我有两个表和相关的 Java 映射 CREATE TABLE country code VARCHAR 3 PRIMARY KEY NOT NULL name VARCHAR 100 NOT NULL CREATE TABLE user i
  • CMD 不支持 UNC 路径作为当前目录

    我们的批处理脚本似乎运行良好 但是我正在编辑其中一个脚本以包含一些新工作 并且在手动运行脚本时 通过从 Windows 资源管理器中双击 每次在脚本中执行 Pushd 命令时 我都会收到上述错误消息遇到 这些是自年初以来就存在的 Pushd
  • Bootstrap 中 CSS 转换中的“强制回流”

    从 Twitter 的 bootstrap 修改 bootstrap modal jquery 插件 我发现他们使用 CSS 过渡来实现淡入淡出效果 代码中让我感兴趣的一件事是这一行 that element 0 offsetWidth f
  • Vue.JS 值与具有焦点的输入相关联

    当输入获得 失去焦点时 有没有办法更改模型中的值 这里的用例是一个搜索输入 它会在您键入时显示结果 这些结果应该仅在焦点位于搜索框上时显示 这是我到目前为止所拥有的
  • OpenGL ES 1.1 中由三角形条带制成的四边形上的纹理变形问题

    我正在使用三角形带创建一个四边形 问题是当我尝试使用矩形纹理来绘制它时 我想在形状上均匀地插值 只要形状是矩形或矩形的仿射变换 我就会有两个相同的三角形来构建形状 一切都会顺利进行 但对于任意形状 三角形具有不同的形状 并且沿着三角形的公共
  • 如何使用纯html、js、jquery构建多语言网站? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 html 来构建页面 问题是如何构建多语言切换 语言翻译不是问题 我有条款 但是 我不知道如何通过菜单栏上的语言按钮 下拉
  • 未调用“MultiUserChat.addInvitationListener”

    我正在研究一个群聊过程 我已成功发送邀请并使用 PSI 收到此邀请 但M无法调用我自己的 MultiUserChat addInvitationListener 我已经做了很多方法 但都是徒劳 这是我的尝试之一 ProviderManage
  • 获取 Google 凭据抛出未处理的异常

    On My Xamarin forms便携式项目 我正在尝试从中读取信息谷歌表格 https developers google com sheets api using var stream this Assets Open client
  • 是否可以添加一个链接来下载只能通过 Facebook 共享才能下载的文件?

    这种情况可能吗 客户访问我的网站 想要下载他们感兴趣的 PDF 技术文档 他们单击 下载 按钮 然后会出现一个 Facebook 共享窗口 让他们登录以将其共享到 Facebook 一旦他们点击共享并将其发布在他们的墙上 然后就开始下载 非
  • Android 浏览器:打开多个 URL,每个 URL 都在新窗口/选项卡上(以编程方式)

    我知道如何使用 Intents 打开 URL Intent browserIntent new Intent android intent action VIEW Uri parse http www lala com startActiv
  • 根据对角线条目对矩阵进行排序

    首先我想指出我的问题与这个问题不同 根据对角线对 numpy 矩阵进行排序 https stackoverflow com questions 12065649 sort a numpy matrix based on its diagon
  • 动画时禁用所有触摸屏交互

    我希望在显示动画时禁用所有触摸屏交互 我不想使用setClickable 方法在动画开始或结束时的按钮上 因为有大量按钮 有什么建议么 在您的 Activity 中 您可以覆盖onTouchEvent而且总是return true 指示您正
  • 在python中使用tabulizer循环遍历pdf文件

    我很难让一段代码正常工作 我想循环遍历文件夹中的 pdf 文件 提取 tabula 包认为表格是什么 将它们提取到数据帧 然后将特定 pdf 中的所有表格写入一个 csv 文件 我在看这个帖子 https stackoverflow com
  • 如何在 WPF 中从第一个窗口打开第二个窗口?

    我是 WPF 新手 我有两个窗口 例如window1和window2 我在window1中有一个按钮 如果我单击该按钮 则必须打开 window2 我应该为此做什么 这是我尝试过的代码 window2 show 将您的代码写入window1
  • 维吉尼亚密码的实现

    我必须实现一个变体维吉尼亚密码 http en wikipedia org wiki Vigen C3 A8re cipher 我的加密部分没有问题 但解密代码中有一个错误 我不明白我做错了什么 要求是 键只能包含A Z 大写 关键字符的代
  • 在同一布局中使用两次片段

    是否可以在一个布局中重复使用同一个片段两次 我有两个选项卡的布局 选项卡 A 和选项卡 B 每个选项卡显示一个视图 其中包含左侧项目列表 类型 A 或 B 和右侧所选项目的详细信息 两种类型的列表的 详细信息视图 在右侧窗格中 是相同的 因
  • PHP:静态和非静态函数和对象

    这些对象调用有什么区别 非静态 var new Object var gt function Static var User function 还有里面一个class为什么我应该使用函数的静态属性 example static public
  • 当我在 vba powerpoint 中按下某个键时调用 Sub

    此代码捕获活动窗口 并通过调用要粘贴的多个屏幕截图将其粘贴到 power point 幻灯片中sub PrintScreen 之后需要 5 秒来捕获活动窗口的屏幕 虽然我希望每当我按下 F7 或 F3 等 等特定键时 它应该打印屏幕而不是等
  • 如果任务抛出 RuntimeException/Error,ScheduledExecutorService.scheduleAt* 方法是否应该重新安排任务?

    有一天 我在我的应用程序中实现了一项重要的服务 无论如何它都应该继续运行 所以我使用了以下构造 ScheduledExecutorService ses Executors newSingleThreadScheduledExecutor