Lumen(Laravel)中队列任务用delay延迟调度时dispatch方法未定义报错
问题产生原因
报错的核心原因是自定义的任务基类Job没有引入Illuminate\Foundation\Bus\Dispatchable Trait,StoreAssetsJob继承的父类中没有提供dispatch()静态方法,因此调用时抛出未定义方法错误。
你当前在基类中引入的InteractsWithQueue、Queueable、SerializesModels三个Trait仅提供任务执行逻辑、队列参数序列化、延迟/队列分配等实例方法,静态调度用的dispatch()方法是Dispatchable Trait独有的能力,Lumen框架默认的任务基类不会自动引入该Trait,因此会缺失该方法。
解决方法
有两种可直接落地的修复方案:
- 方案1:给任务基类补充引入
DispatchableTrait
修改App\Jobs\Job基类代码,新增引入对应Trait:
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; // 新增引入语句 use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; abstract class Job implements ShouldQueue { // 新增Dispatchable到Trait引入列表 use InteractsWithQueue, Queueable, SerializesModels, Dispatchable; }
修改完成后,你原有的调度代码StoreAssetsJob::dispatch($params['ids'])->delay(Carbon::now()->addHours(1));即可正常运行。
- 方案2:使用全局辅助函数调度,无需修改任务类代码
如果不想调整原有任务基类逻辑,可以直接替换调度代码,调用Lumen自带的全局dispatch()辅助函数实现任务调度:
dispatch(new StoreAssetsJob($params['ids']))->delay(Carbon::now()->addHours(1));
该方案不需要修改任何任务类代码,兼容性更强。
内容的提问来源于stack exchange,提问作者KubiRoazhon
相关产品推荐
相关产品推荐

