Как проверить, завершена ли работа в очереди в Beanstalkd в Laravel

Мне нужно проверить, завершено ли задание, добавленное в очередь (Beanstalkd) в Laravel (Laravel 5), и в случае его завершения мне нужно вернуть обновленную запись (задача добавлена ​​в запись обновлений очереди в базе данных). Я добавил к своему composer.json:

"pda/pheanstalk": "3.*"

Я добавляю задание в очередь следующим образом:

$jobId = Queue::push('App\Class', $object->toArray(), $this->getQueueName());

Я использую, чтобы проверить, была ли работа завершена, используя следующую функцию:

public function find($queueName, $jobId, $recordId)
{
$phean = Queue::getPheanstalk();

try {
$phean->peek($jobId);
$data = ['status' => 'waiting'];
} catch (ServerException $e) {
$message = $e->getMessage();

if ($message == 'NOT_FOUND: Job ' . $jobId . ' does not exist.') {
$data = ... // here I get from database data for $recordId

} else {
$data = ['status' => 'error'];
}
}

return $data;
}

Вопрос в том, является ли этот надежный метод проверки выполнения задания? Я сравниваю здесь только сообщение, которое я получаю из исключения. Я не нашел другого способа проверить, была ли работа завершена.

5

Решение

Я еще не использовал Laravel 5, но на Laravel 4 у вас есть таблица невыполненных заданий. Где вы можете увидеть, какие работы не завершены. Я предполагаю, что L5 может иметь что-то или продолжать тот же процесс. Это не решит твою проблему?

С моей точки зрения кажется, что вы только переворачиваете перспективу. Вместо того, чтобы искать то, что не удалось, вы ищете то, что сработало.

Источник

1

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

Я еще не использую Laravel 5. Но в Laravel 4, когда задание завершено, его необходимо вручную удалить из очереди. Вот официальная документация:

Deleting A Processed Job: Once you have processed a job, it must be deleted from the queue, which can be done via the delete method on the Job instance

Это просто означает, что если вы не используете такой метод, статус задания останется незавершенным. В вашем случае вы можете получить очередь и посмотреть, есть ли там идентификатор задания.

0

Если вам нужно запустить команду, основанную на завершении задания — тогда, похоже, вам следует просто запустить команду из очереди, когда задание завершено, — тогда ваша система справится с остальными?

В противном случае «опрос» для работы, чтобы увидеть, если / когда она завершена, кажется громоздким и неэффективным.

В Laravel 5 вы можете использовать новый инструмент Commands, предоставленный Тейлором, и иметь ShouldBeQueued реализация применена — поэтому команда ставится в очередь для выполнения по завершении вашей другой задачи.

0