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

Posted

技术标签:

【中文标题】如何将链式作业分派到 Lumen 6 中的队列?【英文标题】:How to dispatch chained jobs to a queue in Lumen 6? 【发布时间】:2020-03-30 15:22:15 【问题描述】:

在 Laravel 中,可以指定在主作业成功执行后应按顺序运行的排队作业列表。如果序列中的一个作业失败,则不会运行其余作业。 Laravel 文档显示这是通过在可调度作业上使用 withChain 方法来完成的,如下例所示:

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->dispatch();

这在 Laravel 中很适合我,但我使用的是 Lumen(Laravel 的轻量级子集)。 根据Lumen's documentation on queues 的说法,“与框架的许多其他部分一样,Lumen 的队列作业功能与 Laravel 的队列作业相同。因此,要了解有关 Lumen 中队列作业的更多信息,请查看完整的 Laravel 队列文档。”

Lumen 文档确实提到了与 Laravel 的一些细微差别,包括将作业分派到队列的方式的不同。它解释了 Lumen 中的作业可以使用调度函数或队列外观来调度:

dispatch(new ExampleJob);

Queue::push(new ExampleJob);

以此为背景,有没有办法在 Lumen 中调度链式作业?我已经搜索了谷歌好几天,最接近我的问题的匹配是这两个链接:

This Stack Overflow post,准确描述了我的问题,但没有提供任何解决方案 This Laracast thread,这表明 $this->dispatch( (new FillBruteFec($import))->chain(new FillRaiFec()) ); 的语法对我也不起作用。

上面的 Stack Overflow 链接解释了 Laravel 语法不起作用的原因是 Lumen 缺少 Illuminate\Foundation\Bus\Dispatchable 特征。

更复杂的问题是,我需要将一组不同的参数传递给我的每个作业 - 即 apparently challenging to do even in the full Laravel framework。

这是我目前在我的 Lumen 应用程序中提交工作的方式(没有链接):

Queue::push(new CreateUser($username,$password));
Queue::push(new SetForwarding($username,$forwardTo));
Queue::push(new EnableIncomingEmail($username));
Queue::push(new EnableOutgoingEmail($username));
Queue::push(new EnableImap($username));

我想链接这些的主要原因是确保在修改该用户的任何后续作业之前成功创建用户记录。

那么,考虑到所有这些……怎么样?是否有可能在 Lumen 中连锁工作?如果是这样,我会使用什么语法?

【问题讨论】:

由于某种原因,Lumen 和 Laravel 没有相同的代码,我在业余时间看了一下 Lumen 和 Laravel 总线源代码,我将尝试将 laravel 代码拉入 lumen 并查看结果 为什么不在 CreateUser 作业中分派其余的作业? 【参考方案1】:

在App\Jobs\Job 类中使用的illuminate/bus/Queueable trait 提供了一个chain 方法,应该使用Job 实例数组 调用该方法以创建作业链。

您可以通过编写来运行一系列作业:

$this->dispatch(
    (new CreateUser($username,$password))
    ->chain([
        new SetForwarding($username,$forwardTo),
        new EnableIncomingEmail($username),
        new EnableOutgoingEmail($username),
        new EnableImap($username)
    ])
);

【讨论】:

迟来的感谢您发布此信息。它在 Lumen 6.3 中对我有用。几个月来我一直在努力让它工作,所以我非常感谢你的帮助。 在流明 8 中也可以工作,谢谢。

以上是关于如何将链式作业分派到 Lumen 6 中的队列?的主要内容,如果未能解决你的问题,请参考以下文章

Lumen 框架使用队列和作业发送电子邮件不工作

Laravel Lumen 队列失败与队列:工作但不是队列:听

在 Laravel/Lumen 中动态创建的工作守护进程队列

有没有办法配置 Alamofire 不将结果分派到主队列?

Livewire 队列作业调度 afterRespone() 不起作用

博客作业03--栈和队列