我已将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);
我唯一能想到的就是设置一个标志“完成”。对于批处理中的每个作业以及批处理中每个作业的结尾,通过检查表中所有批处理相关行的标志来检查是否所有作业都已完成,如果是,则将createReportForBatch排队。虽然这样做似乎有点hackish然后我不得不提出问题,我可以在另一个BackgroundJob(基本上嵌套)中排队后台工作。感谢您的任何意见或建议。
答案 0 :(得分:3)
<强> 1。实施过滤器
批次使用可供任何人使用的扩展性API。您可以创建一个过滤器,在创建阶段将后台作业ID添加到某个持久集,在状态更改过程中为集中的项设置“已处理”状态,在处理作业时检查其他待处理作业,并启动一个新的后台作业,如果它是批处理中的最后一个作业。
这是批次的高级概述。为了避免不同的竞争条件和不同的场景(作业重新排队,删除等),有很多事情需要考虑。
<强> 2。使用Hangfire + TPL
或者,如果批处理中的后台作业数量相对较少,则可以使用Hangfire + TPL并行执行计算。所以 Batch A 是一个简单的后台工作, Batch B 是它的延续。 批处理A 和批处理B 的方法使用TPL,方法jobAN
,Task.WaitAll
等待完成。
答案 1 :(得分:-2)
Hangfire现在支持批量作业链接,如Hangfire文档中所述:http://docs.hangfire.io/en/latest/background-methods/using-batches.html#chaining-batches。 完成第一个批处理后,只需添加BackgroundJob.ContinueWith即可将新批次排入队列:
var id = BatchJob.StartNew(
{
BackgroundJob.Enqueue(jobA1);
BackgroundJob.Enqueue(jobA2);
BackgroundJob.Enqueue(jobA3);
});
BatchJob.ContinueWith(id, x => {
BackgroundJob.Enqueue(createReportForBatchA);
});