【问题标题】:Laravel Single Job Class dispatched multiple times with different parameters getting overwrittenLaravel Single Job Class 多次分派,不同的参数被覆盖
【发布时间】:2020-02-25 15:33:50
【问题描述】:

我正在使用 Laravel Jobs 以分页方式从 Stripe API 中提取数据。基本上,每个工作都有一个“品牌 id”(一个用户每个帐户可以有多个品牌)和一个“开始时间”参数。它使用它来知道要使用哪个条带标记以及在分页调用中从哪里开始(如果分页中有更多条带响应可用,则此作业会自行调用)。当作业启动一次时,它运行良好。

但是有一个用例,用户可以在短时间内向多个品牌添加条带键,并且可以使用不同的参数同时多次调用该作业类。发生这种情况时,无论哪个进程最后启动都会覆盖其他进程,因为参数将被覆盖到最后调用的。因此,如果我以brand_id = 1 开始条带作业,然后以brand_id = 2 作业,然后brand_id = 3, 3 在一个周期后覆盖另外两个,并且只有3 个通过所有未来的调用。

如何防止这种情况发生?

我尝试过静态变量、受保护变量、私有变量和公共变量。我认为也许可以通过为每个品牌动态创建队列来解决它,但这似乎是一个非常令人头疼的问题。

public function __construct($brand_id, $start_after = null)
    {
        $this->brand_id       = $brand_id;
        $this->start_after = $start_after;
    }

public function handle()
{
    // Do stripe calls with $brand_id & $start_after

    if ($response->has_more) {
    // Call next job with new "start_at".
        dispatch(new ThisJob($this->brand_id, $new_start_after));
    }
}

【问题讨论】:

  • 您能分享一下您的ThisJob 班级代码吗?
  • 我应该更清楚。示例代码是 ThisJob。该作业是递归的,以便对 Stripe API 调用的所有结果进行分页。
  • 这很奇怪。我从来没有听说过被覆盖的工作。被覆盖的结果不是你做的吗?

标签: laravel laravel-queue


【解决方案1】:

根据 Laravel Documentation

如果您在没有明确定义它的队列的情况下调度作业 应该被分派到,作业将被放置在队列中 在连接配置的 queue 属性中定义。

// This job is sent to the default queue...
dispatch(new Job);

// This job is sent to the "emails" queue...
dispatch((new Job)->onQueue('emails'));

但是,将作业推送到具有唯一名称的多个队列对于您的用例可能特别有用。

队列名称可以是唯一标识队列本身的任何字符串。例如,您可能希望基于uniqid()$brand_id 构造队列名称。

例如:

dispatch(new ThisJob($this->brand_id, $new_start_after)->onQueue(uniqid() . '_' . $this->brand_id));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多