Laravel队列Job类failed()方法中如何获取失败任务的job_id
Laravel 队列任务 failed 方法内获取 job_id 实现方案
你当前的写法只差两个细节修正就能正常运行:
failed()方法需要声明Throwable类型入参,框架会自动传入导致任务失败的异常实例,直接在方法内使用未声明的$exception会抛出未定义变量错误- 你已经引入的
InteractsWithQueuetrait 会在任务被队列消费时,自动将底层队列任务实例赋值给$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
相关产品推荐
相关产品推荐

