Как я могу проверить статус очереди в Laravel?

Мне нужно отправить несколько заданий в очередь Laravel для обработки некоторых загруженных CSV-файлов. Эти задания могут быть завершены за одну секунду, если файлы маленькие, или несколько секунд, если они большие, или, возможно, до минуты, если файлы CSV очень большие. И я не могу заранее сказать, насколько большими будут файлы.

Когда пользователь переходит на страницу «результаты», мне нужно отобразить результаты, но только если очередь завершила задания. Если очередь все еще обрабатывается, мне нужно отобразить сообщение «повторите попытку позже».

Итак, есть ли способ проверить с контроллера, закончилась ли очередь?

В настоящее время я использую Laravel 5.1, но с удовольствием обновлюсь, если это поможет. В настоящее время я использую драйвер очереди базы данных. В идеале я хотел бы найти общий метод, который работает для всех драйверов очередей, но если единственный способ сделать это — проверить таблицу базы данных, то я думаю, что это то, что мне нужно сделать.

Спасибо!


person Brendan White    schedule 07.08.2016    source источник
comment
... так что на самом деле это не ответ, а обходной путь. Когда я отправляю задание, я также добавляю запись в таблицу с именем import_jobs, в которой для обработанного поля установлено значение N. Когда я закончу обработку задания в очереди, я обновлю запись в таблице import_jobs, чтобы она была обработана = Y , И прежде чем показать результаты, я сначала ищу записи в таблице import_jobs с обработанным значением N. Если они есть, я перечисляю их и говорю Вернуться позже. Если их нет, я иду вперед и отображаю результаты. Не красиво, но я не придумал лучшего обходного пути. :-(   -  person Brendan White    schedule 19.08.2016
comment
Почему вы считаете это не красивым? Это довольно верное решение. Чтобы иметь возможность запрашивать статус процесса, вам необходимо где-то сохранить, обновить и подготовить эту информацию для запроса. База данных полностью подходит для этой цели.   -  person Sergey Neskhodovskiy    schedule 01.04.2017
comment
Это означает, что мне нужна совершенно новая таблица для отдельного отслеживания того, что происходит в очереди, и я должен поддерживать эту отдельную таблицу в актуальном состоянии вручную. Но у очереди уже есть какой-то метод, чтобы узнать, выполняется ли задание, поставлено ли оно в очередь, завершено ли оно, произошло ли сбой или что-то еще. Мне кажется, чище было бы просто как-нибудь попросить очередь. Но если это невозможно, то это нормально. Я могу просто использовать отдельную таблицу.   -  person Brendan White    schedule 13.04.2017
comment
@BrendanWhite Мне интересно сделать что-то похожее на ваше решение, как вы отслеживали конкретные задания, используя эту другую таблицу? Я использую столбцы report_name и processed, которые вы упомянули. Проблема, с которой я столкнулся сейчас, заключается в том, что могут быть отчеты с одинаковыми именами, поэтому у меня возникают проблемы с их различением в таблице, чтобы изменить столбец processed. Что ты предлагаешь?   -  person Nancy    schedule 28.07.2020
comment
Привет, Нэнси, в конце концов мы изменили направление и так и не реализовали это. Но вы можете создать задание в таблице import_jobs, а затем сохранить идентификатор этой новой записи и свериться с идентификатором вместо report_name.   -  person Brendan White    schedule 30.07.2020


Ответы (1)


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

$job = (new ProcessCSVJob($data))->onQueue($uniqueQueueName);

Затем вы можете просто выполнить подсчет в базе данных в поле имени очереди, если вам нужно решение только для БД.

Чтобы работать со всеми типами очередей, вы можете использовать метод размера очереди, чтобы вернуть размер очереди.

$queue = App::make('queue.connection');
$size = $queue->size($uniqueQueueName);

Это в Laravel 5.4. Не уверен, насколько это обратно совместимо.

person Robert Norman    schedule 04.08.2017
comment
Это отлично работает в L5.6. Альтернативный способ получить размер — через фасад Queue: $size = \Queue::size($uniqueQueueName);. Я заметил, что некоторые драйверы очередей могут вызвать исключение, если именованная очередь не существует. Я не уверен, что это ошибка в драйверах, но это нужно учитывать. Использование фасада может быть более надежным, если имя контейнера IoC («queue.connection») изменяется внутри. - person Jason; 08.03.2018