Rails为单个作业更改ActiveJob适配器

时间:2016-10-03 12:34:55

标签: ruby-on-rails jobs ruby-on-rails-5 rails-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 个答案:

答案 0 :(得分:0)

我相信“perform_now”就是您正在寻找的......立即运行任务,而无需排队。

比照Active http://edgeapi.rubyonrails.org/classes/ActiveJob/Base.html

上的ActiveJob

除此之外,真的,只需让你的“执行”有一个标志(“has_whatever_output_you_have_in_mind”)并在你的执行动作中使用它来触发输出。