Рельсы меняют адаптер ActiveJob на одну работу
У меня есть некоторые запланированные задачи, которые запускают задания с реальной службой очереди.
Теперь я хочу иметь возможность запускать эти задачи вручную с панели инструментов, ждать его выполнения и считывать / обрабатывать некоторые из его выходных данных в действии контроллера. Типичный случай, когда администратор хочет вручную перезагрузить некоторую статистику, и вполне нормально остановить сервер на пару секунд.
Есть ли способ изменить адаптер ActiveJob на "встроенный", чтобы сделать это? Если возможно, я также хотел бы прочитать некоторые артефакты, сгенерированные этим заданием (это могут быть переменные экземпляра или возвращаемое значение perform
действие).
Есть ли способ сделать это?
Образец работы
class TopLevelJob < ApplicationJob
def perform
some_iterator.each do
SomeNestedJob.rand.perform_later
# There are several types of sub-jobs that can be called
# Passing a flag param (perform vs perform_later) would be kind of annoying
end
end
module SomeNestedJob
class A < ApplicationJob;
def perform
# May in turn spawn an other job with perform_later
end
end
...
class Z < ApplicationJob; ...; end
def self.rand
[A..Z].sample
end
end
1 ответ
Я считаю, что "execute_now" - это то, что вы ищете... запускает задачу сразу, не заходя в очередь.
ср ActiveJob на http://edgeapi.rubyonrails.org/classes/ActiveJob/Base.html
Кроме этого, на самом деле, просто сделайте, чтобы у вашего "перформанса" был флаг ("has_whwhat_output_you_have_in_mind") и используйте его в вашем действии перформанса для запуска вывода.