Рельсы меняют адаптер 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") и используйте его в вашем действии перформанса для запуска вывода.

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