检查 hangfire 循环作业是否已在运行

Wes*_*een 4 .net hangfire asp.net-core

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

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

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

我环顾四周,找不到任何关于此的信息。

Tec*_*Sam 9

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

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

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

[DisableConcurrentExecution(10)]
[AutomaticRetry(Attempts = 0, LogEvents = false, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
Run Code Online (Sandbox Code Playgroud)

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

这按照我想要的方式工作:

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

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


小智 3

我们正在使用作业过滤器,特别是这个: MaximumConcurrentExecutions - https://github.com/alastairtree/Hangfire.MaximumConcurrentExecutions 这将防止您的作业的多个实例被启动。

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

它们都有类似的用途,前者允许您将最大值限制为 > 1,而使用后者将不允许对作业进行任何并发处理。

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