如何在启动时删除所有Hangfire定期作业?

45

我正在考虑使用Hangfire作为定期任务的工作调度程序。因此,使用AddOrUpdate进行配置非常简单,但如何删除它呢?我不想在代码中添加 RecurringJob.RemoveIfExists() 以避免当该作业已被删除时污染我的代码,并且要记住稍后再将其删除。

是否有一种方法可以获取所有定期工作的列表并在服务器启动时删除它们,这样每次我的代码都会重新添加它们?如果没有,是否有更好的方法?

例如:

应用程序版本1:添加了一个新的Hangfire定期工作 Do something 1

应用程序版本2:添加了两个新的Hangfire定期工作 Do something 2Do Something 3

应用程序版本3:删除了Hangfire定期工作 Do something 2

问题:该作业仍将存在于服务器上,错误显示“无法加载类型...”并需要删除。

3个回答

84

可能有点晚了,但希望对其他人有所帮助。我也遇到了同样的情况。最终,在HangFire定期任务数据的答案帮助下解决了问题。

我使用JobStorage循环遍历所有定期作业,并逐个删除它们,如下所示:

using (var connection = JobStorage.Current.GetConnection())
{
    foreach (var recurringJob in connection.GetRecurringJobs())
    {
        RecurringJob.RemoveIfExists(recurringJob.Id);
    }
}

我相信有更好的方法,但我找不到它


2
这个答案已经过时了。 - Chris Weber
1
@ChrisWeber,它适用于1.7.18,这是目前最新的版本。我只粘贴了代码,没有进行任何更改。 - Paul-Sebastian Manole

22

保罗的答案很有帮助,但 API 似乎已经改变。在使用 Hangfire 1.6.20 时,我需要从StorageConnectionExtensions中获取循环作业。

using (var connection = JobStorage.Current.GetConnection()) 
{
    foreach (var recurringJob in StorageConnectionExtensions.GetRecurringJobs(connection)) 
    {
        RecurringJob.RemoveIfExists(recurringJob.Id);
    }
}

3
需要在文件顶部添加 using Hangfire.Storage,但是没错,这就是我需要删除所有循环作业的方法。谢谢! - Gary Rogers
8
由于StorageConnectionExtensions类已经很容易理解了,GetRecurringJobs()方法是连接对象的扩展方法,所以不需要通过静态扩展类调用它,可以使用connection.GetRecurringJobs()代替。 - Francesco

2
根据 Hangfire 文档,
public static void RemoveIfExists(
    string recurringJobId
)

通过这种方法,您可以传递您想要删除的作业ID。
RecurringJob.RemoveIfExists("exampleClassName.exampleFunctionName");

I don't want to pollute my code with RecurringJob.RemoveIfExists() when that job has been deleted and then have to remember to delete it later. - kamilz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接