我创建了两个侦听器(一个用于发送电子邮件,另一个用于处理视频),无需编写任何代码来手动链接它们。看来在 Laravel 11 中,事件和监听器之间的连接是自动发生的。
两个侦听器都工作正常,但问题是第二个侦听器(视频处理)在第一个侦听器(电子邮件发送)之前运行。
如何确保监听器按照正确的顺序执行?
在 Laravel 11 中如何控制这些监听器的执行顺序?
您可以有 2 个独立的队列来控制执行优先级。在您的
config/queue.php
中,您可以创建高优先级和低优先级队列:
'high' => [
'driver' => 'database',
'connection' => env('DB_QUEUE_CONNECTION'),
'table' => env('DB_QUEUE_TABLE', 'jobs'),
'queue' => env('DB_QUEUE', 'default'),
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
'after_commit' => false,
],
'low' => [
'driver' => 'database',
'connection' => env('DB_QUEUE_CONNECTION'),
'table' => env('DB_QUEUE_TABLE', 'jobs'),
'queue' => env('DB_QUEUE', 'default'),
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
'after_commit' => false,
],
之后,当触发事件时,您可以使用
onQueue()
方法定义将它们分派到哪个队列:
VideoEvent::dispatch()->onQueue('high');
EmailEvent::dispatch()->onQueue('low');
最后你所要做的就是像这样运行你的队列:
php artisan queue:work --queue=high,low
这将确保在继续处理低队列上的任何作业之前先处理所有高队列作业。
了解更多官方文档:https://laravel.com/docs/11.x/queues#queue-priorities