ActiveJob - в чем разница между MyJob.new.perform и MyJob.perform_now? - PullRequest
0 голосов
/ 26 июня 2019

Я обнаружил, что ActiveJob может сработать на MyJob.new.perform и MyJob.perform_now.

Мой вопрос: в чем разница между этими двумя вызовами?

1 Ответ

1 голос
/ 26 июня 2019

Метод perform_now является оберткой для метода perform класса ActiveJob::Execution.Исходный код (сокращенный для ответа) для обоих этих методов можно найти здесь, на 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 (метод 3 в нашем фрагменте), который является методом экземпляра класса ActiveJob::Execution.

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"

Эта статья Кароля Галанчака подробно объясняет работу и должна быть интересной, если вам нужна дополнительная информация о работе.

...