ActiveJob-MyJob.new.perform和MyJob.perform_now之间有什么区别?

时间:2019-06-26 05:31:45

标签: ruby-on-rails rails-activejob

我发现ActiveJob可以由MyJob.new.performMyJob.perform_now触发。

我的问题是:这两个电话有什么区别?

1 个答案:

答案 0 :(得分:1)

perform_now方法是perform类的ActiveJob::Execution方法的包装。这两种方法的源代码(缩写为答案)可以在here on GitHub中找到。源代码如下:

module ActiveJob
  module Execution
    extend ActiveSupport::Concern
    include ActiveSupport::Rescuable

    # Includes methods for executing and performing jobs instantly.
    module ClassMethods
      # Method 1
      def perform_now(*args)
        job_or_instantiate(*args).perform_now
      end
    end

    # Instance method. Method 2
    def perform_now
      self.executions = (executions || 0) + 1

      deserialize_arguments_if_needed
      run_callbacks :perform do
        perform(*arguments)
      end
    rescue => exception
      rescue_with_handler(exception) || raise
    end

    # Method 3
    def perform(*)
      fail NotImplementedError
    end

MyJob.perform_now 此调用将调用类方法perform_now(摘录中的方法1),该方法在内部实例化MyJob的对象并调用实例方法perform_now(摘录中的方法2)。如果需要,此方法反序列化参数,然后运行我们可能在作业文件中为MyJob定义的回调。此后,它将调用perform类的实例方法ActiveJob::Execution方法(在代码段中为方法3)。

MyJob.new.perform 如果使用此表示法,则基本上是我们自己实例化作业的实例,然后在作业上调用perform方法(代码段的方法3)。这样,我们跳过了perform_now提供的反序列化,还跳过了运行在我们的工作MyJob上编写的所有回调。

举例说明:

# app/jobs/my_job.rb

class UpdatePrStatusJob < ApplicationJob
  before_perform do |job|
    p "I'm in the before perform callback"
  end

  def perform(*args)
    p "I'm performing the job"
  end
end

MyJob.perform_now给出输出:

"I'm in the before perform callback"
"I'm performing the job"

MyJob.new.perform给出输出:

"I'm performing the job"

This article by Karol Galanciak详细介绍了工作,如果您正在寻找有关工作方式的更多信息,应该是有趣的读物。