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

本文关键字:情况下 处理 批处理 作业 Pro Hangfire | 更新日期: 2023-09-27 18:31:39

我已经在我的项目中实现了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);

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

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

1. 实现过滤器

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

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

2. 使用吊火 + TPL

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