Получение списка задач в очереди с помощью ActiveJob AsyncAdapter

Есть ли способ увидеть, сколько (может быть, даже проверить каждое задание?) заданий осталось в очереди?


person alexandernst    schedule 13.10.2016    source источник
comment
эй, дайте мне знать, сработало ли для вас приведенное ниже предложение, если вы уже пробовали его - мне любопытно, но еще не было времени, чтобы проверить его :) (может быть, в выходные)   -  person Andrey Deineko    schedule 14.10.2016
comment
То же самое :) Сегодня не удалось проверить. Посмотрим, смогу ли я добраться до этого завтра утром ;)   -  person alexandernst    schedule 14.10.2016


Ответы (1)


После некоторого изучения исходного кода вот что я узнал:

ActiveJob::QueueAdapters::AsyncAdapter использует Параллельный пул потоков Ruby для планирования и выполнения заданий.

Когда вы инициализируете адаптер в своей конфигурации, вы передаете параметры исполнителя, которые, в свою очередь, являются аргументами initialize метода Concurrent::ThreadPoolExecutor.

Созданный экземпляр класса Concurrent::ThreadPoolExecutor имеет такие методы, как:

  • queue_length — количество задач в очередь, ожидающая выполнения.
  • scheduled_task_count — количество задач, которые было запланировано для выполнения на бассейне с момента строительства.

Тем не менее, я думаю, что что-то в этом роде должно сделать это за вас:

ActiveJob::Base
  .queue_adapter
  .instance_variable_get(:@scheduler)
  .instance_variable_get(:@async_executor)
  .public_send(:queue_length)

Выше делается следующее:

  1. получить свой адаптер
  2. получить его instance_variable @scheduler , что указывает на
  3. экземпляр Concurrent::ThreadPoolExecutor (переменная экземпляра класса Scheduler - @async_executor)
  4. на котором реально можно вызывать методы, описанные выше (queue_length, scheduled_task_count и другие)

Хотя я не проверял это, так что не забудьте дважды проверить на опечатки или что-то еще.

person Andrey Deineko    schedule 13.10.2016
comment
Хорошо, я только что попробовал. Кажется, это не работает. Он всегда возвращает 0. - person alexandernst; 14.10.2016
comment
@alexandernst подумайте об этом, он возвращает целое число, поэтому я почти уверен, что он работает в том смысле, что вызывает правильный метод. Вы пробовали другие методы? Кроме того, вы на 1000% уверены, что он не должен возвращать 0? - person Andrey Deineko; 15.10.2016
comment
Я попробовал это решение. Я пробовал queue_length, scheduled_task_count, completed_task_count. Все они всегда возвращают 0 - person mario199; 26.11.2018
comment
Получение async_executor адаптера возвращает экземпляр Concurrent::ThreadPoolExecutor. Проблема в том, что счетчики Concurrent::ThreadPoolExecutor по какой-то причине не обновляются. - person robertoplancarte; 08.06.2020