123456789_123456789_123456789_123456789_123456789_

Module: ActiveJob::Core

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: activejob/lib/active_job/core.rb

Overview

Provides general behavior that will be included into every Active Job object that inherits from Base.

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Attribute Summary

Instance Method Summary

Instance Attribute Details

#_scheduled_at_time (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 18

attr_reader :_scheduled_at_time # :nodoc:

#arguments (rw)

Job arguments

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 12

attr_accessor :arguments

#arguments_serialized?Boolean (readonly, private)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 213

def arguments_serialized?
  defined?(@serialized_arguments) && @serialized_arguments
end

#enqueue_error (rw)

Track any exceptions raised by the backend so callers can inspect the errors.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 58

attr_accessor :enqueue_error

#enqueued_at (rw)

Track when a job was enqueued

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 48

attr_accessor :enqueued_at

#exception_executions (rw)

::Hash that contains the number of times this job handled errors for each specific retry_on declaration. Keys are the string representation of the exceptions listed in the retry_on declaration, while its associated value holds the number of executions where the corresponding retry_on declaration handled one of its listed exceptions.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 39

attr_accessor :exception_executions

#executions (rw)

Number of times this job has been executed (which increments on every retry, like after an exception).

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 33

attr_accessor :executions

#job_id (rw)

Job Identifier

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 21

attr_accessor :job_id

#locale (rw)

I18n.locale to be used during the job.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 42

attr_accessor :locale

#priority=(value) (writeonly)

Priority that the job will have (lower is more priority).

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 27

attr_writer :priority

#provider_job_id (rw)

ID optionally provided by adapter

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 30

attr_accessor :provider_job_id

#queue_name=(value) (writeonly)

Queue in which the job will reside.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 24

attr_writer :queue_name

#scheduled_at (rw)

::Time when the job should be performed

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 16

attr_reader :scheduled_at

#scheduled_at=(value) (rw)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 177

def scheduled_at=(value)
  @_scheduled_at_time = if value&.is_a?(Numeric)
    ActiveJob.deprecator.warn(<<~MSG.squish)
      Assigning a numeric/epoch value to scheduled_at is deprecated. Use a Time object instead.
    MSG
    Time.at(value)
  else
    value
  end
  @scheduled_at = value
end

#serialized_arguments=(value) (writeonly)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 13

attr_writer :serialized_arguments

#successfully_enqueued=(value) (rw)

This method is for internal use only.

Track whether the adapter received the job successfully.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 51

attr_writer :successfully_enqueued # :nodoc:

#successfully_enqueued?Boolean (rw)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 53

def successfully_enqueued?
  @successfully_enqueued
end

#timezone (rw)

Timezone to be used during the job.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 45

attr_accessor :timezone

Instance Method Details

#deserialize(job_data)

Attaches the stored job data to the current instance. Receives a hash returned from #serialize

Examples

class DeliverWebhookJob < ActiveJob::Base
  attr_writer :attempt_number

  def attempt_number
    @attempt_number ||= 0
  end

  def serialize
    super.merge('attempt_number' => attempt_number + 1)
  end

  def deserialize(job_data)
    super
    self.attempt_number = job_data['attempt_number']
  end

  rescue_from(Timeout::Error) do |exception|
    raise exception if attempt_number > 5
    retry_job(wait: 10)
  end
end
[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 153

def deserialize(job_data)
  self.job_id               = job_data["job_id"]
  self.provider_job_id      = job_data["provider_job_id"]
  self.queue_name           = job_data["queue_name"]
  self.priority             = job_data["priority"]
  self.serialized_arguments = job_data["arguments"]
  self.executions           = job_data["executions"]
  self.exception_executions = job_data["exception_executions"]
  self.locale               = job_data["locale"] || I18n.locale.to_s
  self.timezone             = job_data["timezone"] || Time.zone&.name
  self.enqueued_at          = Time.iso8601(job_data["enqueued_at"]) if job_data["enqueued_at"]
  self.scheduled_at         = Time.iso8601(job_data["scheduled_at"]) if job_data["scheduled_at"]
end

#deserialize_arguments(serialized_args) (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 209

def deserialize_arguments(serialized_args)
  Arguments.deserialize(serialized_args)
end

#deserialize_arguments_if_needed (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 198

def deserialize_arguments_if_needed
  if arguments_serialized?
    @arguments = deserialize_arguments(@serialized_arguments)
    @serialized_arguments = nil
  end
end

#initialize(*arguments)

Creates a new job instance. Takes the arguments that will be passed to the perform method.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 95

def initialize(*arguments)
  @arguments  = arguments
  @job_id     = SecureRandom.uuid
  @queue_name = self.class.queue_name
  @scheduled_at = nil
  @_scheduled_at_time = nil
  @priority   = self.class.priority
  @executions = 0
  @exception_executions = {}
  @timezone   = Time.zone&.name
end

#serialize

Returns a hash with the job data that can safely be passed to the queuing adapter.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 110

def serialize
  {
    "job_class"  => self.class.name,
    "job_id"     => job_id,
    "provider_job_id" => provider_job_id,
    "queue_name" => queue_name,
    "priority"   => priority,
    "arguments"  => serialize_arguments_if_needed(arguments),
    "executions" => executions,
    "exception_executions" => exception_executions,
    "locale"     => I18n.locale.to_s,
    "timezone"   => timezone,
    "enqueued_at" => Time.now.utc.iso8601(9),
    "scheduled_at" => _scheduled_at_time ? _scheduled_at_time.utc.iso8601(9) : nil,
  }
end

#serialize_arguments(arguments) (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 205

def serialize_arguments(arguments)
  Arguments.serialize(arguments)
end

#serialize_arguments_if_needed(arguments) (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 190

def serialize_arguments_if_needed(arguments)
  if arguments_serialized?
    @serialized_arguments
  else
    serialize_arguments(arguments)
  end
end

#set(options = {})

This method is for internal use only.

Configures the job with the given options.

[ GitHub ]

  
# File 'activejob/lib/active_job/core.rb', line 168

def set(options = {}) # :nodoc:
  self.scheduled_at = options[:wait].seconds.from_now if options[:wait]
  self.scheduled_at = options[:wait_until] if options[:wait_until]
  self.queue_name   = self.class.queue_name_from_part(options[:queue]) if options[:queue]
  self.priority     = options[:priority].to_i if options[:priority]

  self
end