【问题标题】:Rails change ActiveJob adapter for a single jobRails 为单个作业更改 ActiveJob 适配器
【发布时间】:2017-02-11 09:50:59
【问题描述】:

我有一些计划任务使用真正的队列服务运行作业。

现在,我希望能够从仪表板手动运行这些任务,等待其执行,并在控制器操作中读取/处理其一些输出。典型的情况是当管理员想要手动重新加载一些统计信息时,可以将服务器停顿几秒钟。

有没有办法将 ActiveJob 适配器更改为“内联”以便做到这一点?如果可能的话,我还想阅读此作业生成的一些工件(可能是实例变量,或者performaction 的返回值)。

有什么办法吗?

示例作业

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

【问题讨论】:

    标签: ruby-on-rails jobs ruby-on-rails-5 rails-activejob


    【解决方案1】:

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

    参见。 http://edgeapi.rubyonrails.org/classes/ActiveJob/Base.html上的ActiveJob

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

    【讨论】:

    • 问题是我的作业触发了几个嵌套作业,更改所有嵌套作业的代码以传递这样一个标志会有点烦人。理想情况下,我只想为当前请求更改配置(然后将其恢复为正常),所以我不必担心所有这些。
    • 也许你想将动作封装在一个模块中并从模块中调用它。但这和前面提到的一样烦人。
    • 您可以定义一个“之前”或“之后”,如果它具有正确的参数(匹配 arg[x] 与“--o”或“-- pdf”)。
    猜你喜欢
    • 2017-03-28
    • 2016-12-25
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多