Laravel无法从crontab派遣作业

时间:2019-09-18 10:30:11

标签: php laravel laravel-5 queue jobs

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

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

但是在crontab错误抛出中使用相同的代码

  

方法App \ Console \ Commands \ AddPreProcess :: dispatch不存在。 {“ exception”:“ [object](BadMethodCallException(code: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类的对象无法转换为字符串< / p>

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

1 个答案:

答案 0 :(得分: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));