Возврат данных из Laravel Jobs

Я разрабатываю API на Laravel для мобильных приложений.

методы будет делать запросы к другим 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-> отправка () возвращает только идентификатор задания в очереди, а не результат справиться метод.

TL; DR: Как я могу вернуть данные из очереди Job, не сохраняя их нигде, и даже если в очереди более одной попытки? Может быть, кто-то знает другие способы, если Джобс не подходит для этого. Любой совет будет оценен.

Заранее спасибо!

4

Решение

Вы возвращаете данные в своем классе 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 (). Но это и есть цель асинхронных работ 🙂

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]