1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activejob/lib/active_job/execution.rb
Jean Boussier 6bad959565 Extract ActiveSupport::ExecutionContext out of ActiveRecord::QueryLogs
I'm working on a standardized error reporting interface
(https://github.com/rails/rails/issues/43472) and it has the same need
for a `context` than Active Record's query logs.

Just like query logs, when reporting an error you want to know what the
current controller or job is, etc.

So by extracting it we can allow both API to use the same store.
2021-11-10 09:36:02 +01:00

63 lines
1.6 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(...)
job_or_instantiate(...).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 queuing adapter
# but directly executed by blocking the execution of others until it's finished.
# +perform_now+ returns the value of your job's +perform+ method.
#
# class MyJob < ActiveJob::Base
# def perform
# "Hello World!"
# end
# end
#
# puts MyJob.new(*args).perform_now # => "Hello World!"
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
_perform_job
rescue Exception => exception
rescue_with_handler(exception) || raise
end
def perform(*)
fail NotImplementedError
end
private
def _perform_job
ActiveSupport::ExecutionContext[:job] = self
run_callbacks :perform do
perform(*arguments)
end
end
end
end