如果已加入Hangfire作业,请将其停止排队

时间:2016-06-13 14:09:40

标签: c# hangfire

是否有一种简单的方法可以阻止hangfire.io作业入队,如果已经入队了?

查看jobfilterattribute,没有什么比如何获取服务器上的任何状态更突出。我可以使用连接对象并查询商店吗?

由于

2 个答案:

答案 0 :(得分:1)

请图书馆老板https://gist.github.com/odinserj/a8332a3f486773baa009

查看以下要点

这样可以通过查询指纹防止同一作业多次出现。

您可以通过使用属性[DisableMultipleQueuedItemsFilter]修饰方法来为每个后台作业激活它。

或者您可以全局启用GlobalJobFilters.Filters.Add(new DisableMultipleQueuedItemsFilter());

答案 1 :(得分:0)

我正在使用以下代码块来检查是否添加新作业,具体取决于其当前状态:(我知道我目前只查看前1000个作业。您可以实现您的逻辑类型))

private static bool IsOKToAddJob(string JobName, string QueueName, out string NotOKKey)
    {
        try
        {
            var monapi = JobStorage.Current.GetMonitoringApi();
            var processingJobs = monapi.ProcessingJobs(0, 1000);
            NotOKKey = processingJobs.Where(j => j.Value.Job.ToString() == JobName).FirstOrDefault().Key;

            if (!string.IsNullOrEmpty(NotOKKey)) return false;

            var scheduledJobs = monapi.ScheduledJobs(0, 1000);
            NotOKKey = scheduledJobs.Where(j => j.Value.Job.ToString() == JobName).FirstOrDefault().Key;

            if (!string.IsNullOrEmpty(NotOKKey)) return false;

            var enqueuedJobs = monapi.EnqueuedJobs(QueueName, 0, 1000);
            NotOKKey = enqueuedJobs.Where(j => j.Value.Job.ToString() == JobName).FirstOrDefault().Key;

            if (!string.IsNullOrEmpty(NotOKKey)) return false;

            NotOKKey = null;
            return true;
        }
        catch (Exception ex)
        {
            //LOG your Exception;
        }
    }

用法很简单:

if (IsOKToAddJob(YOURJOBNAME, QueueName, out NOTOKKey))
    var id = BackgroundJob.Enqueue(() =>YOURMETHOD()); 

//rest