我正在Laravel上为移动应用程序开发API。
方法 将向其他API 发出请求,合并和过滤数据,更改其结构等。
应用程序的要求之一是响应时间不超过30秒,或者根本不响应。所以,我必须尽可能多地重复请求。我试图通过Laravel Queues意识到这一点,并且目前在我的Job类中有类似的东西:
private $apiActionName;
public function __construct($apiActionName)
{
$this->apiActionName = $apiActionName;
}
public function handle(SomeService $someService)
{
return $someService->{$this->apiActionName}();
}
这个动作代码在控制器中:
public function someAction()
{
$data = $this->dispatch(new MyJob($apiActionName));
return response()->json($data);
}
是的,我知道从工作中返回价值是个坏主意,但希望它是可能的。但是 $ this-> dispatch()仅返回排队的作业ID,而不是 handle 方法的结果。
TL; DR:如何从排队的作业中返回数据,而不将其保存在任何地方,即使队列中有多次尝试?如果乔布斯不适合这个,也许有人知道其他方法。任何建议将不胜感激。
提前致谢!
答案 0 :(得分:5)
您正在Job类中返回数据,但是将$ data分配给调度程序 - 请注意,dispatch()方法不是Job类的一部分。
假设您的作业同步运行,您可以尝试这样的事情:
private $apiActionName;
private $response;
public function __construct($apiActionName)
{
$this->apiActionName = $apiActionName;
}
public function handle(SomeService $someService)
{
$this->response = $someService->{$this->apiActionName}();
}
public function getResponse()
{
return $this->response;
}
然后在你的控制器中:
public function someAction()
{
$job = new MyJob($apiActionName);
$data = $this->dispatch($job);
return response()->json($job->getResponse());
}
显然,一旦你转向异步模式和队列,这将无法工作 - 当你调用getResponse()时,响应仍然不存在。但那是异步工作的全部目的:)