2015-01-11 10 views
5

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

"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; 
} 

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

ответ

1

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

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

Источник: http://laravel.com/docs/4.2/queues#failed-jobs

0

Я не использую 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

Вы правы, но работа идет к неудачным работам, когда он терпит неудачу. Поэтому, когда я хочу проверить, завершено ли задание, даже если я искал неудачные задания, мне нужно как-то проверить, работает ли задание в очереди, потому что оно может оставаться в очереди, а не в неудачных заданиях. –

+0

Эй, похоже, что pbeanstalk не предлагает способ получить полный список рабочих заданий. Вы можете сохранить информацию о работе в базу данных и пометить ее статус при ее удалении или сбое. – Ray

0

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

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

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

Смежные вопросы