gpt4 book ai didi

php - 你如何暂停 Laravel 队列

转载 作者:可可西里 更新时间:2023-11-01 13:59:36 27 4
gpt4 key购买 nike

我有一个向远程服务发送请求的队列。有时此服务会进行维护。当遇到这种情况时,我希望所有队列任务都暂停并在 10 分钟后重试。我该如何实现?

最佳答案

您可以使用 Queue::looping() 事件监听器来暂停整个队列或连接(而不仅仅是单个作业类)。与其他方法不同,这将不会在队列暂停时将每个作业置于弹出/重新排队的循环中,这意味着尝试次数不会增加

文档是这样说的:

Using the looping method on the Queue facade, you may specifycallbacks that execute before the worker attempts to fetch a job froma queue.

https://laravel.com/docs/5.8/queues#job-events

这个没有很好地记录的是,如果回调返回false,那么the worker will not fetch another job .例如,这将阻止 default 队列运行:

Queue::looping(function (\Illuminate\Queue\Events\Looping $event) {
// $event->connectionName (e.g. "database")
// $event->queue (e.g. "default")

if ($event->queue == 'default') {
return false;
}
});

注意:事件的 queue 属性将包含工作进程启动时来自命令行的值,因此如果您的工作进程正在检查多个队列(例如 artisan queue :work --queue=high,default) 那么事件中 queue 的值将是 'high,default'。作为预防措施,您可能希望用逗号分解字符串并检查 default 是否在列表中。

例如,如果您想创建一个基本的 circuit breaker当您的邮件服务返回维护错误时暂停邮件队列,然后您可以在您的EventServiceProvider.php中注册一个监听器:

/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();

Queue::looping(function (\Illuminate\Queue\Events\Looping $event) {
if (($event->queue == 'mail') && (cache()->get('mail-queue-paused'))) {
return false;
}
});
}

这假设您在应用程序的其他地方有一种机制来检测适当的情况,并且在本例中,该机制需要为 mail-queue-paused 键分配一个值共享缓存(因为这是我的代码正在检查的内容)。有更强大的解决方案,但在缓存中设置一个特定的众所周知的 key (并使其自动过期)很简单并且可以达到预期的效果。

关于php - 你如何暂停 Laravel 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46138812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com