【问题标题】:Running nested batches inside a batched chain of jobs在批处理作业链中运行嵌套批处理
【发布时间】:2023-01-25 20:32:57
【问题描述】:

我有一系列批处理的链式作业,在这些链中我需要能够批处理其他作业。

假设我有 3 个客户

对于每个客户,我需要

  1. 将他们的详细信息与外部 API 同步
  2. 创建 0 个或多个新案例并单独同步它们
  3. 更新 0 个或多个现有案例并单独同步它们

    我需要包装批次来跟踪这一切何时完成。

    我目前有以下结构:

    $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 都应该分派他们自己的一批作业,因为每个案例都需要单独同步

    问题当然是创建/更新作业在分派时在链中“完成”,而不是在所有内部作业完成时。因此,BatchA 作业在尚未同步任何案例时将被标记为已完成。

【问题讨论】:

    标签: laravel laravel-8 laravel-queue


    【解决方案1】:

    我通过让每批作业在 ->finally() 回调中发送一个事件来解决这个问题。然后该事件的侦听器将构建并开始下一批。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2015-07-30
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多