mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
e49fb7921e
Currently, the execution count increments after deserializes arguments. Therefore, if an error occurs with deserialize, it retries indefinitely. In order to prevent this, the count is moved before deserialize. Fixes #33344.
49 lines
1.3 KiB
Ruby
49 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "active_support/rescuable"
|
|
require "active_job/arguments"
|
|
|
|
module ActiveJob
|
|
module Execution
|
|
extend ActiveSupport::Concern
|
|
include ActiveSupport::Rescuable
|
|
|
|
# Includes methods for executing and performing jobs instantly.
|
|
module ClassMethods
|
|
# Performs the job immediately.
|
|
#
|
|
# MyJob.perform_now("mike")
|
|
#
|
|
def perform_now(*args)
|
|
job_or_instantiate(*args).perform_now
|
|
end
|
|
|
|
def execute(job_data) #:nodoc:
|
|
ActiveJob::Callbacks.run_callbacks(:execute) do
|
|
job = deserialize(job_data)
|
|
job.perform_now
|
|
end
|
|
end
|
|
end
|
|
|
|
# Performs the job immediately. The job is not sent to the queueing adapter
|
|
# but directly executed by blocking the execution of others until it's finished.
|
|
#
|
|
# MyJob.new(*args).perform_now
|
|
def perform_now
|
|
# Guard against jobs that were persisted before we started counting executions by zeroing out nil counters
|
|
self.executions = (executions || 0) + 1
|
|
|
|
deserialize_arguments_if_needed
|
|
run_callbacks :perform do
|
|
perform(*arguments)
|
|
end
|
|
rescue => exception
|
|
rescue_with_handler(exception) || raise
|
|
end
|
|
|
|
def perform(*)
|
|
fail NotImplementedError
|
|
end
|
|
end
|
|
end
|