【问题标题】:Check if hangfire recurring job is already running检查hangfire重复作业是否已经在运行
【发布时间】:2018-06-15 03:58:43
【问题描述】:

我有一个利用 Hangfire 执行后台任务和作业的网络应用程序。

我有一个重复性作业,该作业的 2 个实例不能同时执行。假设这项工作需要更长的时间来执行。

我想检查作业当前是否正在运行,如果是,请不要重新运行。

我环顾四周,找不到任何相关信息。

【问题讨论】:

  • 这里的 cmets 中有一些指导:docs.hangfire.io/en/latest/background-methods/…。本质上,没有好的方法,但有一些潜在的解决方法。
  • @ChrisPratt 谢谢你。是的,我认为没有明显的方法可以做到这一点。

标签: .net asp.net-core hangfire


【解决方案1】:

有没有人想过更简单的解决方案?除了其他字段之外,还有一个表示“IsProcessing”的位字段的 sql 表怎么样。这项工作会在一开始就检查这一点。如果为真,则退出。完成后,将其设置为 false。 想法?

【讨论】:

    【解决方案2】:

    我们正在使用工作过滤器,特别是这个: 最大并发执行次数 - https://github.com/alastairtree/Hangfire.MaximumConcurrentExecutions 这将防止您的工作的多个实例被解雇。

    你也可以看看 DisableConcurrentExecution - https://discuss.hangfire.io/t/disableconcurentexecution-does-not-appear-to-work/158.

    它们都具有相似的目的,前者允许您将最大值限制为 > 1 的数字,而使用后者将不允许对 Job 进行任何并发处理。

    但是,如果您在同一个函数中处理多个不同的作业,则需要更新过滤器以检查要限制的特定作业类型。

    【讨论】:

      【解决方案3】:

      有多个地方可以回答部分问题,但要让我完全正常工作,我必须做两件事:

      1. 了解属性
      2. 把它们放在接口上,而不是实现方法上

      因此,如果您使用接口(例如使用依赖注入)来启动 Hangfire 作业,请将它们放在 Interface 定义中

      [DisableConcurrentExecution(10)]
      [AutomaticRetry(Attempts = 0, LogEvents = false, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
      

      如果您不以这种方式执行 AutomaticRetry 属性,则默认情况下该作业将被添加到计划作业列表中,以便在第一个完成时运行。

      这是我想要的方式:

      每 5 分钟运行一次作业。如果在接下来的 5 分钟间隔内,前一个作业仍在运行,请不要将它的新实例排队。

      如果你把这些放在实现接口的方法上,它什么也不做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-29
        • 2015-04-18
        • 2014-08-25
        • 2018-08-10
        • 2013-03-15
        • 1970-01-01
        相关资源
        最近更新 更多