检查hangfire定期作业是否已在运行

时间:2018-01-05 10:42:52

标签: .net asp.net-core hangfire

我有一个网络应用程序正在利用Hangfire来完成后台任务和工作。

我有一个定期工作,任何时候都无法执行此工作的2个实例。让我们说这项工作需要更长的时间来执行。

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

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

3 个答案:

答案 0 :(得分:1)

我们正在使用作业过滤器,特别是这个: MaximumConcurrentExecutions - https://github.com/alastairtree/Hangfire.MaximumConcurrentExecutions 这样可以防止多个工作实例被激活。

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

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

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

答案 1 :(得分:0)

可以在多个地方回答部分内容,但是为了使它完全起作用,我必须做两件事:

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

因此,如果您正在使用接口(例如带有依赖项注入)来启动Hangfire工作,则将它们放在 Interface 定义

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

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

这可以达到我想要的方式:

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

如果将它们放在实现接口的方法上,则它什么都不做。

答案 2 :(得分:0)

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