这是后续 Laravel - Running Jobs in Sequence
我决定使用 Redis 速率限制。代码如下
jobClass {
protected $subscription;
public function __construct(Subscription$subscription) {
$this->subscription= $subscription;
}
public function handle() {
Redis::funnel('mailingJob')->limit(1)->then(function () {
// Job logic...
(new Mailer($this->subscription))->send();
}, function () {
// Could not obtain lock...
return $this->release(10);
});
}
}
Controller 代码看起来像。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Subscriptions;
class MailController extends Controller
{
public function sendEmail() {
Subscriptions::all()
->each(function($subscription) {
SendMailJob::dispatch($subscription);
});
}
}
现在,当我运行队列时,他们中的一些工作休息(大约 90%)失败并出现以下错误。
SendMailJob has been attempted too many times or run too long. The job may have previously timed out.
我错过了什么?请有人指导我正确的方向。
我的目标是一次只运行一种类型的一项作业。
最佳答案
[...] has been attempted too many times or run too long
是一个错误,不会告诉您作业失败的原因。这意味着 一些其他异常 导致您的作业在工作人员每次尝试时都失败,并且工作人员已经尝试了您的配置允许的最大次数。要了解它失败的原因,请检查您的 laravel.log 文件中是否存在导致作业失败的异常。
在您的情况下,由于 Mailer
正在联系外部系统,因此您连接的系统可能会限制您的速率,或者他们可能遇到临时连接问题或其他服务停机。同样,您的日志文件中应该有更多详细信息。
关于laravel - 作业总是在 laravel 作业失败 Redis 速率限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013988/