目前,Hangfire仪表板提供了重新排队作业的选项(成功或失败),在我的情况下,运行两次作业可能会导致问题。
我尝试添加AutomaticRetry属性...
[AutomaticRetry(Attempts = 0)]
当作业失败时,解决了问题,作业没有自动重新排队,但按钮仍在仪表板上,可以手动重新排队。
答案 0 :(得分:1)
如何删除作业?
RecurringJob.RemoveIfExists("myJobID");
答案 1 :(得分:0)
根据odinserj
在Hangfire Discussion上的建议。
您可以简单地在循环作业中使用条件并将其存储在数据库中以防止作业运行:
public void MyMethod()
{
if (someCondition) { return; }
/* ... */
}
答案 2 :(得分:0)
当前无法使Hangfire停止运行作业。例如,当您遇到作业中使用的一项服务出现问题时,您想要停止执行hangfire直到问题解决。
想法是让您的工作引发例外。然后它将进入失败状态,并根据您的AutomaticRetry设置尝试自动重新运行该作业(如果需要,自动重新运行该作业)(最多达到定义的重试次数)或停留在该位置,以便一旦问题解决,您就可以手动从仪表板。
把工作安排在那儿等待服务重新上线听起来不明智(总的来说,我显然不十分了解您的具体情况)。
总的来说,我发现即使进行自动重试,我也非常小心。我什至只有在保证自己所做的工作是幂等的情况下才考虑这样做(即多次执行相同的操作不会引起问题)。
想象一个工作,使公司中每个雇员的薪水增加100美元(即,设定的薪水=薪水+ 100)。您运行作业以更新数据库,但是在数据库服务器连接断开的途中。一半的雇员加薪,另一半尚未加薪。再次执行相同的工作不应将第二次100美元的增加应用于第一次执行的员工。
停止整个服务器似乎也有些麻烦。我相信建议的机制是,如果您不希望该作业(如果是重复性的作业而不是一发不可收拾)让其入队一段时间,则删除该作业。然后,当问题解决后,您只需重新安排它的时间即可。我确实同意暂停功能会很不错。您可以使用jobfilters和IElectStateFilters自己扩展hangfire以实现此目的。只需在一个布尔值(即IsHangfirePaused = true)可以在OnStateElection事件中签入的位置,并在将其设置为true时阻止作业过渡到EnqueuedState。
这是根据https://discuss.hangfire.io/t/ability-to-stop-running-jobs/4215/2