如果我在控制器队列中使用此代码效果很好
$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的作业队列,任何建议都很好。
答案 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));