首页 > 解决方案 > Laravel:我可以在作业的句柄()中失败吗?

问题描述

我知道,如果作业抛出异常,作业将失败,并将在几秒钟内从队列工作人员自动重试。

我的问题是:我能以可控的方式失败吗?

我想捕获异常,创建更小的日志,例如,返回 false 以将作业标记为失败。

有办法吗?

精确:我不想处理失败。我想在不抛出异常的情况下挑起失败。我需要一些边缘情况,工作失败。但我也需要避免抛出异常,以避免通过哨兵和其他内部工具发出一连串警告。我只是希望一个return false但处理程序不希望返回值。

标签: laravelqueuejobs

解决方案


如果您想处理所有失败的命令,请选择 Petay 建议的Failed作业事件。如果您想处理单个作业的失败,您可以实现该方法,就像您实现该方法一样。failedhandle

您可以直接在您的作业类上定义一个失败的方法,允许您在发生故障时执行特定于作业的清理。这是向您的用户发送警报或恢复作业执行的任何操作的理想位置。导致作业失败的异常将被传递给 failed 方法:

class ProcessPodcast implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    public function handle()
    {
        // Handle job and throw exception
    }

    public function failed(Exception $exception)
    {
        // Create log file
    }
}

--tries可以在调用工作人员时使用该选项将作业标记为失败。

然后,在运行队列工作程序时,您应该使用 queue:work 命令上的 --tries 开关指定应尝试作业的最大次数。如果您没有为 --tries 选项指定值,则将无限期地尝试作业:

php artisan queue:work redis --tries=3

如果您想手动触发失败,您可以抛出异常或返回状态码,如下所示:

    public function handle(): int
    {
        if($somethingWentWrong) {
            return -2;
        }

        return 0;
    }

推荐阅读