如果一个人已经入队,是否有一种简单的方法可以阻止hangfire.io作业入队?
看看jobfilterattribute,没有什么比如何获得服务器上的任何状态更突出.我可以使用连接对象并查询商店吗?
谢谢
看看库所有者的以下要点https://gist.github.com/odinserj/a8332a3f486773baa009
这应该可以防止同一作业通过查询指纹多次排队。
您可以通过使用属性装饰该方法来为每个后台作业激活它[DisableMultipleQueuedItemsFilter]。
或者您可以全局启用它GlobalJobFilters.Filters.Add(new DisableMultipleQueuedItemsFilter());
我正在使用以下代码块来检查是否添加新作业,具体取决于其当前状态:(我知道我目前只查看前 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)