我有一系列批量的链式作业,在这些链中,我需要能够批量处理其他作业。
假设我有3个客户端
对于每个客户端,我需要
1.将其详细信息与外部API同步
1.创建0个或多个新案例并单独同步它们
1.更新0个或多个现有案例并分别同步
我需要 Package 材料来记录这些东西什么时候完成。
我目前的结构如下:
$jobs = $clients->map(fn(Client $client) => [
new SyncClientJob(...),
new CreateMultipleCasesJob(...),
new UpdateMultipleCasesJob(...)
]);
Bus::batch($jobs)->name('BatchA')->etc()
在CreateCasesJob中,执行沿着于以下内容的操作
public function handle()
{
$jobs = $collection_of_new_cases->map(fn(Case $case) => new CreateSingleCaseJob($case));
Bus::batch($jobs)->dispatch();
}
CreateCasesJob和UpdateCasesJob都应该分派自己的作业批,因为每个案例都需要单独同步
当然,问题在于,Create/Update作业在被分派时在链中是“完成”的,而不是在其所有内部作业都完成时,因此BatchA
作业将在尚未同步任何案例时被标记为完成。
1条答案
按热度按时间7fyelxc51#
我通过让每批作业在-〉finally()回调函数中分派一个事件来解决这个问题,然后该事件的侦听器将构建并启动下一批作业。