我使用队列发送短信。效果很好。接下来,Ubuntu服务器出现的问题是我必须重新安装supervisor。重置后出现这个问题。
生产.错误:照亮\队列\MaxAttemptsExceededException:已尝试排队作业太多次。该作业之前可能已超时。在/home/.../.../vendor/laravel/framework/src/Illuminate/Queue/Worker.php:385
您需要编辑config/queue.php
'retry_after' => 1800, // This parameter is responsible for timeout
确保 retry_after 值大于作业运行所需的时间,队列文档中已经提到了这一点。
我的队列在 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
错误消失了
如果您在同一个作业中使用
$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 秒。我认为此设置可以正常工作,不会引发错误。
我也遇到同样的问题
我通过在 Job 类中使用以下代码解决了该问题。
public $failOnTimeout = false;
如果超时或作业失败,则会继续。我还增加了超时时间。
public $timeout = 120000;