【问题标题】:How to handle a failed job laravel如何处理失败的工作 laravel
【发布时间】:2018-08-16 21:16:40
【问题描述】:

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

foreach ($transactions as $transaction) {
    $job = (new SendApplicationToBank($transaction));
    $this->dispatch($job);
}

一笔交易涉及多家银行,因此我将向所有相关银行发送一笔交易:

工作:

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

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

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

结果:

php artisan queue:listen

【问题讨论】:

    标签: laravel


    【解决方案1】:

    您不应该抓住Exception 让作业正常失败。现在你抓住了它,什么也不做 (//Silent fail)

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

    php artisan queue:failed-table
    

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

    php artisan queue:listen --tries=3
    

    添加某种超时也很聪明:

    php artisan queue:listen --tries=3 --timeout=60
    

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

    public function failed()
    {
        // Called when the job is failing...
    }
    

    【讨论】:

    • 是的,在上图中很清楚我在这种情况下使用尝试。另外我使用的是redis而不是mysql
    • 啊,我没看到是图片链接。也许您最好复制输出并将其作为代码添加到您的问题中。
    • 我认为你不应该捕获异常让工作失败。现在您正在捕获异常,但没有对它做任何事情。
    【解决方案2】:

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

    php artisan queue:work --retry=3
    

    它只会尝试运行你的作业 3 次

    您可以通过编程方式使用

        public $tries = 3;
    

    在你的工作类别中

    希望对你有帮助

    【讨论】:

    • 是的,在上图中很清楚我在这种情况下使用尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2016-06-07
    • 2012-07-18
    • 2010-11-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多