“如何修复 Laravel 作业尝试次数过多或运行时间过长的问题”

问题描述 投票:0回答:4

我使用队列发送短信。效果很好。接下来,Ubuntu服务器出现的问题是我必须重新安装supervisor。重置后出现这个问题。

生产.错误:照亮\队列\MaxAttemptsExceededException:已尝试排队作业太多次。该作业之前可能已超时。在/home/.../.../vendor/laravel/framework/src/Illuminate/Queue/Worker.php:385

laravel ubuntu supervisord
4个回答
4
投票

您需要编辑config/queue.php


'retry_after' => 1800, // This parameter is responsible for timeout

确保 retry_after 值大于作业运行所需的时间,队列文档中已经提到了这一点。


1
投票

我的队列在 Fedora Linux 服务器的主管下运行

在我的supervisord.conf中

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/app/current/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=webapp
numprocs=8
redirect_stderr=true
stdout_logfile=/var/app/current/worker.log
stopwaitsecs=36000

通过这个配置文件,我有你显示的错误,但是当我删除睡眠并尝试像这样的标记时

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/app/current/artisan queue:work 
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=webapp
numprocs=8
redirect_stderr=true
stdout_logfile=/var/app/current/worker.log
stopwaitsecs=36000

错误消失了


0
投票

如果您在同一个作业中使用

$tries
$backoff
参数和
retryUntil()
方法,则需要遵循一个重要规则:

retryUntil()
方法必须比
$tries
$backoff
的乘法更好。

$tries * $backoff < retryUntil

示例:

<?php

class ExampleJob implements ShouldQueue
{
    use Dispatchable, Queueable;

    public $tries = 5;

    public $backoff = 1;

    public function handle(): void
    {
        throw new Exception("Error");
    }

    public function retryUntil()
    {
        return now()->addSeconds(10);
    }
}

在这个例子中,尝试次数为5次,每次尝试之间有1秒的延迟,retryUntil()方法设置为10秒,

    $tries * $backoff < retryUntil
    5* 1 < 10 = 5 < 10

听说 5 秒不到 10 秒。我认为此设置可以正常工作,不会引发错误。


0
投票

我也遇到同样的问题

我通过在 Job 类中使用以下代码解决了该问题。

public $failOnTimeout = false;

如果超时或作业失败,则会继续。我还增加了超时时间。

public $timeout = 120000;

参考:https://laravel.com/docs/9.x/queues#failing-on-timeout

© www.soinside.com 2019 - 2024. All rights reserved.