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单一作业类被分派了多次,不同的参数被覆盖了的主要内容,如果未能解决你的问题,请参考以下文章