2017-06-17 8 views
1

私たちはいくつかのシステムでHangfireを使用していましたが、Hangfireバッチ機能を使用して並行してタスクを実行しましたが、それは逐次的な仕事である。Hangfireネストされたバッチでエラーが発生する

BatchJob.Attach(masterBatch, batch => 
    { 
     var lockJobId = batch.Enqueue<IProcessJob>(job => job.ObtainLock(businessUnit)); 

     var preparationJobId = batch.ContinueWith<IPrepareProcessJob>(lockJobId, 
      job => job.PrepareData(businessUnit, workingJobData, JobCancellationToken.Null)); 

     var statisticsJobId = batch.ContinueWith<IPrepareProcessJob>(preparationJobId, 
      job => job.AddStatistics(businessUnit, workingJobData, JobCancellationToken.Null)); 

     var processFileId = batch.ContinueWith<IProcessJob>(statisticsJobId, 
      job => job.ProcessFile(workingJobData, notifierInstructions, businessUnit, 
          JobCancellationToken.Null)); 

     batch.ContinueWith<IProcessJob>(processFileId, job => job.ReleaseLock(businessUnit)); 
    }); 

を私たちは常に3つの処理の仕事に起こるものは何でも、最終的なロック解除ジョブを実行したいので、私たちは中央の3つのジョブの周りに、ネストされたバッチを導入しようとしたしかし:罰金作品を以下のように単純なバッチを使用して

次のように:

BatchJob.Attach(masterBatch, batch => 
    { 
     var lockJobId = batch.Enqueue<IProcessJob>(job => job.ObtainLock(businessUnit)); 

     var mainBatchId = batch.AwaitJob(lockJobId, mainBatch => 
     { 
      var preparationJobId = mainBatch.Enqueue<IPrepareProcessJob>(
       job => job.PrepareData(businessUnit, jobData, JobCancellationToken.Null)); 

      var statisticsJobId = mainBatch.ContinueWith<IPrepareProcessJob>(preparationJobId, 
       job => job.AddStatistics(businessUnit, jobData, JobCancellationToken.Null)); 

      mainBatch.ContinueWith<IProcessJob>(statisticsJobId, 
       job => job.ProcessFile(jobData, notifierInstructions, businessUnit, 
        JobCancellationToken.Null)); 
     }); 

     batch.AwaitBatch<IProcessJob>(mainBatchId, job => job.ReleaseLock(businessUnit)); 
    }); 

これはエラーを生成します。

Can't create a continuation for batch 'a5955434-294e-4568-9b64-c167feeb95da' because it doesn't exist. 

Hangfireが最終リリースロックを添付しようとすると、エラーが発生しているかどうか調査中です。誰かが私たちが間違っているかもしれないことについて何か示唆を得ていますか?

答えて

1

この問題を解決するために数時間を費やしましたが、ネストされたバッチを含むバージョンを投げずにエラーを投げることはできませんが、少し並べ替えて入れ子にすることなく、 :

BatchJob.Attach(mainBatchId, batch => 
{ 
    var lockJobId = batch.Enqueue<IProcessJob>(job => job.ObtainLock(businessUnit)); 

    var preparationJobId = batch.ContinueWith<IPrepareProcessJob>(lockJobId, 
     job => job.PrepareData(businessUnit, workingJobData, JobCancellationToken.Null)); 

    var statisticsJobId = batch.ContinueWith<IPrepareProcessJob>(preparationJobId, 
     job => job.AddStatistics(businessUnit, workingJobData, JobCancellationToken.Null)); 

    batch.ContinueWith<IProcessJob>(statisticsJobId, 
     job => job.ProcessFile(workingJobData, notifierInstructions, businessUnit, 
      JobCancellationToken.Null)); 
}); 

// Catch-all unlock 
BatchJob.AwaitBatch(mainBatchId, 
    batch => batch.Enqueue<IProcessJob>(job => job.ReleaseLock(businessUnit)), 
    $"Unlock for {reportName}", BatchContinuationOptions.OnAnyFinishedState); 
関連する問題