Laravel单一作业类被分派了多次,不同的参数被覆盖了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel单一作业类被分派了多次,不同的参数被覆盖了相关的知识,希望对你有一定的参考价值。

我正在使用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));
    }
}

答案

根据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));

以上是关于Laravel单一作业类被分派了多次,不同的参数被覆盖了的主要内容,如果未能解决你的问题,请参考以下文章

ElasticBeanstalk worker cron 每分钟运行多次

如何将链式作业分派到 Lumen 6 中的队列?

Laravel 嵌套作业

生成为 Laravel 作业队列创建表的迁移?

JAVA面试题

Ngrx 一次分派一个动作多次