2016-03-31 4 views
1

Я работаю над проектом с использованием laravel 4.2, и я отправляю задания в очередь beanstalk. Когда работник забирает задание для выполнения, я пытаюсь захватить идентификатор задания и привязывать его к таблице failed_jobs в случае сбоя задания.Laravel beanstalk id задания не соответствует

Проблема заключается в том, что идентификатор, возвращаемый из метода Pheanstalk_Job->getId(), никогда не совпадает с идентификатором записи в таблице failed_jobs.

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

+0

Возможно, вам лучше было бы добавить свою собственную метаинформацию в заданиях, которые вы создаете с уникальным идентификатором, и проверить на это. Любые идентификаторы, которые возвращают beanstalkd, скорее всего, будут преходящими. –

ответ

0

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

  1. Создано миграцию, который создал таблицу исключения, включая поля исключения, т.е. сообщение исключения, код, файл, строку, а также поле для идентификатора задания beanstalkd.
  2. Создал миграцию, которая точно смоделирована после схемы failed_jobs, предоставленной laravel, с добавлением другого поля, идентификатора задания beanstalkd.
  3. Создал собственный QueueServiceProvider и связал службы 'queue.failer' и 'queue.worker' с моими собственными реализациями. Моя реализация «failer» расширяет Illuminate\Queue\Failed\DatabaseFailedJobProvider и просто добавляет метод для вставки, который включает идентификатор задания beanstalkd. Моя реализация «worker» расширяет Illuminate\Queue\Worker и переопределяет метод logFailedJob, чтобы вызвать мой собственный метод неудачной загрузки задания.
  4. В app/config/queue.php Я включил, 'failed' => ['database' => 'mysql', 'table' => 'exception_failed_jobs'], чтобы сообщить laravel, чтобы использовать мою собственную таблицу неудачных заданий с именем «exception_failed_jobs».
  5. В моем коде обработчика заданий метод пожара обертывает мою бизнес-логику в try/catch и любые поднятые исключения приведут к тому, что исключение будет храниться в моей таблице исключений, включая идентификатор задания beanstalkd.

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

Не могу дождаться, чтобы перенести этот проект с 4.2 и до последней версии. Я понимаю, что в последнем ларавеле эта функциональность уже испечена :)

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