2016-06-13 51 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