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

Wil*_*iam 5 c# hangfire

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

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

谢谢

tja*_*ams 5

看看库所有者的以下要点https://gist.github.com/odinserj/a8332a3f486773baa009

这应该可以防止同一作业通过查询指纹多次排队。

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

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

  • 这个解决方案在最新的 Hangire 1.7.8 中仍然有效吗?这个解决方案是防弹的吗?它是否会以某种方式影响性能?我们通过 Hangfire 完成很多工作。 (2认同)

Onu*_*mer 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

而且用法很简单:

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

//rest
Run Code Online (Sandbox Code Playgroud)