2016-06-13 50 views
4

如果队列已经入队,是否有一种简单方法可以阻止hangfire.io作业入队?如果已经入队,请停止Hangfire作业排队

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

感谢

+0

另一种选择是'DisableConcurrentExecution'属性。它有一个必需的'timeoutInSeconds'参数。 – aethercowboy

+1

这只会让他们一次处理一个,而不是我想要实现的。 – William

回答

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 
+0

有趣的解决方案,但因为我必须在紧密交易中排队,我不想在客户端进行查询。也许我可以在属性中做到这一点。谢谢! – William

+0

当我调用'IsOKToAddJob'时,如何获得'YOURJOBNAME'? – akshayKhot