在 Redis 上使用 Forge 上的 Laravel Horizon,我有一个default
队列和一个notifications
队列。
通知作业都是在最近的作业下建立的,具有暂停状态,不会得到处理。这是使用的代码:
$event->owner->notify((new ItemWasLiked($event))->onQueue('notifications'));
我发现处理它们的唯一方法是手动显式运行以下命令以供notifications
处理:
php artisan queue:work --queue=notifications
这不应该是自动出现的吗?我错过了什么?
我们需要指示 Horizon 通过在 config/horizon 中的队列工作线程配置中添加一个元素来启动一个队列工作线程,该工作线程除了处理default
队列之外还处理notifications
队列.php:
'environments' => [
...
'(environment name)' => [
'supervisor-1' => [
...
'queue' => [ 'default', 'notifications' ],
],
],
],
'queue'
指令声明 Horizon 工作人员监视作业的队列。现成配置仅指定default
队列,因此工作线程将仅处理推送到该队列的作业。以上大致相当于:
php artisan queue:work --queue=default,notifications
。其中逗号分隔列表中的第一个队列具有最高优先级,最后一个队列具有最低优先级。Horizon 通过分配更大的进程数份额而不是按优先级顺序处理队列来确定队列的优先级。
或者,我们可以将第二个工作组添加到处理第二个队列的配置中:
'(environment name)' => [
'supervisor-1' => [
...
'queue' => [ 'default' ],
],
'supervisor-2' => [
...
'queue' => [ 'notifications' ],
],
],
。Horizon 会为同时运行的两个队列中的每一个启动队列工作进程。