我发现ActiveJob可以由MyJob.new.perform
和MyJob.perform_now
触发。
我的问题是:这两个电话有什么区别?
答案 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详细介绍了工作,如果您正在寻找有关工作方式的更多信息,应该是有趣的读物。