Как я могу устранить неполадки, возникающие при сбое заданий в очереди?

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

Решение

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

Другие вопросы по тегам