2015-11-14 421 views
1

我正在處理請求需要執行任務的Web API RESTful服務。我們使用Hangfire作爲一項工作執行該任務,如果失敗,將嘗試重試該任務多達10次。如何在Hangfire作業成功或失敗時執行新作業?

如果作業最終成功我想運行一個額外的作業(將事件發送到另一個服務)。如果在所有重試嘗試後作業都失敗,我想運行其他附加作業(將故障事件發送到其他服務)。

但是,我無法弄清楚如何做到這一點。我創建了以下JobFilterAttribute:

public class HandleEventsAttribute : JobFilterAttribute, IElectStateFilter 
{ 
    public IBackgroundJobClient BackgroundJobClient { get; set; } 

    public void OnStateElection(ElectStateContext context) 
    { 
     var failedState = context.CandidateState as FailedState; 
     if (failedState != null) 
     { 
      BackgroundJobClient.Enqueue<MyJobClass>(x => x.RunJob()); 
     } 
    } 
} 

我遇到的一個問題是將IBackgroundJobClient注入到此屬性中。我不能將它作爲屬性傳遞給屬性(我得到「無法訪問靜態上下文中的非靜態字段'backgroundJobClient'」錯誤)。我們正在使用autofac進行依賴注入,並且我嘗試瞭解如何使用屬性注入,但是我不知所措。所有這些讓我相信我可能走錯了路。

我想如果一個Hangfire作業失敗,運行一些額外的清理代碼將是一個相當常見的模式。大多數人如何做到這一點?

感謝您的幫助。讓我知道是否有任何額外的細節,我可以提供。

回答

0

我還沒有能夠驗證這將工作,但BackgroundJobClient沒有靜態方法,所以你需要一個對它的實例的引用。

當我排隊任務時,我使用靜態Hangfire.BackgroundJob.Enqueue,它應該在沒有對JobClient實例的引用的情況下工作。

Steve

1

Hangfire可以構建一個執行鏈。如果您想在第一次成功後安排下一份工作,則需要使用ContinueWith(string parentId, Expression<Action> methodCall, JobContinuationOptions options);JobContinuationOptions.OnlyOnSucceededState才能在成功後運行它。

但是,您可以創建像JobExecutor這樣的HangFire擴展,並在其中運行任務以獲得更多可能性。

類似的東西:

public static JobResult<T> Enqueue<T>(Expression<Action> a, string name) 
{ 
    var exprInfo = GetExpressionInfo(a); 

    Guid jGuid = Guid.NewGuid(); 

    var jobId = BackgroundJob.Enqueue(() => JobExecutor.Execute(jGuid, exprInfo.Method.DeclaringType.AssemblyQualifiedName, exprInfo.Method.Name, exprInfo.Parameters, exprInfo.ParameterTypes));    

    JobResult<T> result = new JobResult<T>(jobId, name, jGuid, 0, default(T)); 
    JobRepository.WriteJobState(new JobResult<T>(jobId, name, jGuid, 0, default(T))); 

    return result; 
} 

更詳細的信息,你可以在這裏找到:https://indexoutofrange.com/Don%27t-do-it-now!-Part-5.-Hangfire-job-continuation,-ContinueWith/