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

Laravel中如何检测Bus Chain是否已失败或中止?

Laravel Bus Chain 失败状态检测方案

一、你的代码问题分析

你当前代码里catch中修改$hasFailed不生效,是因为变量按值传递,use ($hasFailed)只会传递变量副本,修改副本不会影响外部变量。另外如果你的队列是异步驱动(如Redis、Database),即使修复引用问题,return时任务还没执行,结果也不对。

二、同步执行场景(队列驱动为sync)

如果你的Bus Chain是同步执行的(队列配置QUEUE_CONNECTION=sync),有两种可行方案:

方案1:变量引用传递

修改use语句为引用传递,确保catch中能修改外部变量:

$hasFailed = false;
Bus::chain($batches)
    ->catch(function (Throwable $e) use (&$hasFailed) {
        $hasFailed = true;
    })
    ->dispatch();

return $hasFailed ? "failed" : "not";

方案2:外层try-catch捕获异常

同步执行时,Chain中任一任务失败都会抛出异常,直接在外层捕获:

$hasFailed = false;
try {
    Bus::chain($batches)->dispatch();
} catch (Throwable $e) {
    $hasFailed = true;
}

return $hasFailed ? "failed" : "not";

三、异步执行场景(队列驱动为异步)

异步场景下,任务在后台执行,当前请求无法立即获取结果,需要通过持久化记录追踪状态:

方案:创建任务日志模型追踪状态

  1. 先创建一个JobLog模型(对应数据库表需包含status、error等字段)
  2. 在Chain的catch和then回调中更新日志状态:
// 创建初始状态为pending的日志
$jobLog = JobLog::create(['status' => 'pending']);

Bus::chain($batches)
    // 任务链执行成功时更新状态
    ->then(function () use ($jobLog) {
        $jobLog->update(['status' => 'success']);
    })
    // 任务链失败时更新状态
    ->catch(function (Throwable $e) use ($jobLog) {
        $jobLog->update([
            'status' => 'failed',
            'error' => $e->getMessage()
        ]);
    })
    ->dispatch();

// 返回日志ID,后续通过查询该ID获取任务链状态
return $jobLog->id;

四、关于$bus->failedJobs

Laravel的Bus Chain实例没有直接暴露failedJobs属性用来检测失败状态,因为异步任务的执行结果不会同步绑定到当前请求的Bus实例上。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:36