我有一个网络应用程序正在利用Hangfire来完成后台任务和工作。
我有一个定期工作,任何时候都无法执行此工作的2个实例。让我们说这项工作需要更长的时间来执行。
我想检查作业当前是否正在运行,如果是,请不要重新运行。
我环顾四周,找不到任何相关信息。
答案 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)
可以在多个地方回答部分内容,但是为了使它完全起作用,我必须做两件事:
因此,如果您正在使用接口(例如带有依赖项注入)来启动Hangfire工作,则将它们放在 Interface 定义
[DisableConcurrentExecution(10)]
[AutomaticRetry(Attempts = 0, LogEvents = false, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
如果您不以这种方式执行AutomaticRetry属性,则默认值为该作业将被添加到“计划的作业”列表中,以便在第一个作业完成时运行。
这可以达到我想要的方式:
每5分钟运行一次作业。如果在接下来的5分钟间隔内,上一个作业仍在运行,请不要将其的新实例排队。
如果将它们放在实现接口的方法上,则它什么都不做。
答案 2 :(得分:0)
有人想到过一个更简单的解决方案吗?在其他字段中还有一个表示“ IsProcessing”的位字段的sql表怎么样。这项工作将在一开始就进行检查。如果为true,则退出。完成后,将其设置为false。 有想法吗?