Как я могу устранить неполадки, возникающие при сбое заданий в очереди?
У меня есть работа, которая отправляется с двумя аргументами - путь и имя файла в файл. Задание анализирует файл с помощью simplexml, затем записывает его в базу данных и перемещает файл в соответствующую папку для безопасного хранения. Если что-то идет не так, он перемещает файл в другую папку для сбойных файлов, а также создает событие, чтобы дать мне уведомление.
Моя проблема в том, что иногда работа молча проваливается. Задание удаляется из очереди, но файл не был проанализирован, и он остается в том же каталоге. Таблица failed_jobs пуста (я использую драйвер очереди базы данных для разработки) и failed()
метод не был запущен. Queue::failing()
Метод, который я добавил в сервис-провайдере приложения, также не был запущен - я знаю, так как оба из них содержат только один вызов журнала, чтобы проверить, были ли они нажаты. Журнал Laravel пуст (он доступен для чтения, и Laravel записывает в него другие ошибки - я дважды проверил), так же как и соответствующие системные журналы, такие как, например, php.
Сначала я подумал, что это проблема тайм-аута, но слушатель очереди не вышел из строя, не остановился и не был перезапущен. В любом случае я увеличил время ожидания до 300 секунд и убедился, что все строки "[datetime] Processed: [job]", которые генерирует слушатель, находятся в пределах этого промежутка времени. Время выполнения php и т. Д. Также намного больше, чем требуется для этой работы.
Так как же я могу устранить эту проблему, когда журналы пусты, ничего не происходит, и я не получаю уведомления о том, что не так? Если я поставлю в очередь 200 файлов, то, возможно, 180 будет обработано, а оставшиеся 20 завершатся с ошибкой. Если я обновлю базу данных + миграции и снова поставлю в очередь те же 200, то, возможно, 182 будут обработаны, а 18 произойдет сбой молча - но они не обязательно будут одинаковыми.
Мой метод дескриптора, упрощенный для отображения соответствующих битов, выглядит следующим образом:
public function handle()
{
try {
$xml = simplexml_load_file($this->path.$this->filename);
$this->parse($xml);
$parsedFilename = config('feeds.parsed path').$this->filename;
File::move($this->path.$this->filename, $parsedFilename);
} catch (Exception $e) {
// if i put deliberate errors in the files, this works fine
$errorFilename = config('feeds.error path').$this->filename;
File::move($this->path.$this->filename, $errorFilename);
event(new ParserThrewAnError($this->filename));
}
}
1 ответ
Итак, я до сих пор абсолютно не знаю, почему, но... после перезапуска виртуальной машины я восемь раз тестировал различные файлы и опции, и у меня не было проблем. Если кто-то может угадать причину, не стесняйтесь отвечать, и я приму ваш ответ, если он звучит разумно. Пока я отмечу свой собственный ответ как правильный, как только смогу, на случай, если кто-то еще наткнется на это позже.