如何在没有 Hangfire Pro 的情况下处理批处理作业

How to handle batch jobs without Hangfire Pro

我已经在我的项目中实现了 Hangfire。我现在需要将技术上属于批处理的多个作业排入队列。公司不会购买提供批处理功能的专业版 Hangfire。有没有一种解决方法可以让我知道所有相关作业何时完成,以便我可以在每批结束时调用另一个函数?

示例:

Batch A:
{
  BackgroundJob.Enqueue(jobA1);
  BackgroundJob.Enqueue(jobA2);
  BackgroundJob.Enqueue(jobA3);
}

When Batch A is all done: 
  BackgroundJob.Enqueue(createReportForBatchA);

Batch B:
{
  BackgroundJob.Enqueue(jobB1);
  BackgroundJob.Enqueue(jobB2);
  BackgroundJob.Enqueue(jobB3);
}

When Batch B is all done: 
  BackgroundJob.Enqueue(createReportForBatchB);

我唯一能想到的是为一个批次中的每个作业设置一个标志 'Done' 并在批次中的每个作业结束时通过检查所有批次的标志来检查所有作业是否完成table 中的相关行,如果是,则将 createReportForBatch 入队。尽管这样做似乎有点老套,然后我不得不提出一个问题,我可以在另一个 BackgroundJob 中排队后台作业(基本上是嵌套的)。感谢您的任何意见或建议。

1.实施过滤器

批处理使用任何人都可以使用的可扩展性 API。您可以创建一个过滤器,在创建阶段将后台作业 ID 添加到某个持久化集合,在状态更改过程中为集合中的项目设置 "processed" 状态,在作业执行时检查其他待处理作业已处理,并启动一个新的后台作业(如果它是批处理中的最后一个作业)。

这是对批次的高级概述。有很多事情需要考虑,以避免不同的竞争条件和不同的场景(作业re-queue、删除等)。

2。使用 Hangfire + TPL

或者,如果批处理中的后台作业数量相对较少,则可以改用 Hangfire + TPL 来并行执行计算。所以 Batch A 是一个简单的后台作业,Batch B 是它的延续。 Batch ABatch B 的方法将 TPL 用于 jobAN 方法 Task.WaitAll 等待完成。