如何处理失败的工作 Laravel

Del*_*her 6 laravel

我在我的 cron 工作中多次调用不同的 api,例如:

foreach ($transactions as $transaction) {
    $job = (new SendApplicationToBank($transaction));
    $this->dispatch($job);
}
Run Code Online (Sandbox Code Playgroud)

一笔交易有许多银行,所以我向所有相关银行发送一笔交易:

工作:

public function handle(){
    try {
        $result = app($bankClass)::sendLoanApplication($this->transaction);
    } catch (Exception $e) {
        //Silent fail
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是它在第一家银行上失败了,只是不断重试。

应该如何去配置,以便如果一项作业失败,只需释放回队列并继续下一项?

结果:

php工匠队列:听

Bjö*_*örn 6

你不应该抓住Exception让工作正常失败的原因。现在你抓住了它,什么都不做 ( //Silent fail)

您应该在数据库中创建一个表以自动捕获失败的作业:

php artisan queue:failed-table
Run Code Online (Sandbox Code Playgroud)

在运行队列的脚本中,您应该添加失败前的尝试次数:

php artisan queue:listen --tries=3
Run Code Online (Sandbox Code Playgroud)

添加某种超时也很聪明:

php artisan queue:listen --tries=3 --timeout=60
Run Code Online (Sandbox Code Playgroud)

您还可以通过向作业添加失败的方法来调用失败时的 webhook:

public function failed()
{
    // Called when the job is failing...
}
Run Code Online (Sandbox Code Playgroud)


Adn*_*taz 3

运行有限尝试的命令您可以运行以下命令

php artisan queue:work --retry=3
Run Code Online (Sandbox Code Playgroud)

它只会尝试运行你的工作三次

并以编程方式您可以使用

    public $tries = 3;
Run Code Online (Sandbox Code Playgroud)

在你的工作类别中

希望这可以帮助