【问题标题】:How to remove all hangfire recurring jobs on startup?如何在启动时删除所有hangfire重复作业?
【发布时间】:2017-03-09 17:04:57
【问题描述】:

我正在考虑将 Hangfire 用作定期作业的作业调度程序。所以使用AddOrUpdate 配置它们很简单,但是我该如何删除它呢?当该作业已被删除时,我不想用RecurringJob.RemoveIfExists() 污染我的代码,然后必须记得稍后再删除它。

有没有办法获取所有重复作业的列表并在服务器启动时将其删除,这样我的代码每次都会重新添加它们?如果没有,有没有更好的方法?

例如

应用程序版本 1:添加了新的 Hangfire 重复作业Do something 1

应用程序版本 2:添加了新的 Hangfire 重复作业Do something 2Do Something 3

应用程序版本 3:删除了 Hangfire 重复作业Do something 2

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

【问题讨论】:

    标签: c# recurring hangfire


    【解决方案1】:

    这个有点晚了,但希望它会帮助别人。我陷入了同样的境地。最后,HangFire recurring task data 上的答案帮助了我。

    我使用JobStorage 循环遍历所有重复作业并依次删除每个作业,如下所示:

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

    我确信那里有更好的方法,但我找不到它

    【讨论】:

    • 这个答案已经过时了。
    • @ChrisWeber,它适用于目前最新的 1.7.18。我只粘贴了代码,没有做任何更改。
    【解决方案2】:

    paul's answer 很有帮助,但 API api 似乎已经改变。使用 Hangfire 1.6.20 我需要从 StorageConnectionExtensions 获得经常性工作

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

    【讨论】:

    • 需要在文件顶部添加一个using Hangfire.Storage,但是是的,这就是我需要删除所有重复工作的内容。谢谢!
    • 由于StorageConnectionExtensions类是不言自明的,GetRecurringJobs()方法是Connection对象的扩展方法,不需要通过静态扩展类调用,使用connection.GetRecurringJobs()代替。
    【解决方案3】:

    根据hangfire docs

    public static void RemoveIfExists(
        string recurringJobId
    )
    

    使用此方法,您可以传递要删除的作业ID。

    RecurringJob.RemoveIfExists("exampleClassName.exampleFunctionName");
    

    【讨论】:

      【解决方案4】:

      在 MongoDB 中,有关重复作业的数据存储在 hangfire.stateData 表中。清除此表可以帮助您。

      【讨论】:

        【解决方案5】:

        您可以使用此代码:

        var recurringJobs = Hangfire.JobStorage.Current.GetConnection().GetRecurringJobs();
        
                    foreach (var item in recurringJobs)
                    {
                        RecurringJob.RemoveIfExists(item.Id);
                    }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多