You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel队列Job类failed()方法中如何获取失败任务的job_id

Laravel 队列任务 failed 方法内获取 job_id 实现方案

你当前的写法只差两个细节修正就能正常运行:

  • failed() 方法需要声明 Throwable 类型入参,框架会自动传入导致任务失败的异常实例,直接在方法内使用未声明的 $exception 会抛出未定义变量错误
  • 你已经引入的 InteractsWithQueue trait 会在任务被队列消费时,自动将底层队列任务实例赋值给 $this->job 属性,直接调用 getJobId() 即可拿到对应id,注意不要和你自定义的业务属性 $this->id 混淆。

修正后的任务类代码

<?php

namespace App\Jobs;

use App\Models\Qprogress;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Throwable;

class ProcessResult implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $id;
    private $authUserId;

    public function __construct($id, $authUserId)
    {
        $this->id = $id;
        $this->authUserId = $authUserId;
    }

    public function handle()
    {
        // 业务执行逻辑,抛出异常时会自动触发failed回调
    }

    public function failed(Throwable $exception)
    {
        // 获取队列系统生成的任务id,和failed_jobs表存储的id一致
        $queueJobId = $this->job->getJobId();
        
        Qprogress::where('queue_id', $queueJobId)
            ->update(['qstatus' => 'job is failed: ' . $exception->getMessage()]);
    }
}

兼容说明

  • 若你使用的是Laravel 8+版本,可加空判断兼容极端场景(比如任务未正式入队就触发失败的情况),避免调用null对象方法报错:
    $queueJobId = $this->job?->getJobId();
    
  • 该方法拿到的job_id和你在AppServiceProvider中全局Queue::failing回调里通过$event->job->getJobId()拿到的值完全一致,区别是全局回调会监听所有队列任务的失败事件,而任务类内的failed()方法仅处理当前任务的失败逻辑,更适合做单任务定制化的善后操作。

内容的提问来源于stack exchange,提问作者Shoshin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:57:06