【问题标题】:Laravel Not able to dispatch job from crontabLaravel 无法从 crontab 调度作业
【发布时间】:2020-01-19 06:54:36
【问题描述】:

如果我在控制器队列中使用此代码效果很好

 $job=(new ReProcessShipment($single_data->request_data))->delay(2);
 $this->dispatch($job);

但在 crontab 中使用相同的代码会引发错误

方法 App\Console\Commands\AddPreProcess::dispatch 不存在。 {“异常”:“[对象](BadMethodCallException(代码:0):
方法 App\Console\Commands\AddPreProcess::dispatch 不存在。

尝试像使用它一样

 $job=(new ReProcessShipment($single_data->request_data))->delay(2);
 ReProcessShipment::dispatch($job);

然后得到错误

类 App\Jobs\ReProcessShipment 的对象无法转换为字符串 {"exception":"[object] (ErrorException(code: 0): 类 App\Jobs\ReProcessShipment 的对象无法转换为字符串 at

我无法处理来自 cronjob 的作业队列,任何建议都会很棒。

【问题讨论】:

    标签: php laravel laravel-5 queue jobs


    【解决方案1】:

    您可以通过在作业类上调用静态dispatch 方法并将作业的构造函数参数传递给dispatch 方法来dispatch 作业,如下所示:

    ReProcessShipment::dispatch($single_data->request_data)->delay(2);
    

    确保您使用 Illuminate\Foundation\Bus\Dispatchable 特征能够在作业类上调用 dispatch,例如:

    use Illuminate\Foundation\Bus\Dispatchable;
    
    class ProcessPodcast implements ShouldQueue
    {
        use Dispatchable, ...
    

    如果您查看source,您会看到静态dispatch 函数使用作业的参数为您创建作业,因此您无需在分派之前创建作业。这是dispatch函数的来源:

    public static function dispatch()
    {
        return new PendingDispatch(new static(...func_get_args()));
    }
    

    所以它本质上改变了这个:

    ReProcessShipment::dispatch($single_data->request_data);
    

    进入这个:

    new PendingDispatch(new ReProcessShipment($single_data->request_data));
    

    【讨论】:

    • 在第二个示例中,您将 $job 传递给 dispatch 方法。在上面的示例中,我将作业的参数传递给 dispatch 方法。
    • 你在做dispatch($job);,我建议dispatch($single_data->request_data)
    猜你喜欢
    • 2023-03-22
    • 2015-10-14
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2021-04-26
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多