class ActiveJob::Uniqueness::Strategies::Base

Base strategy is not supposed to actually be used as uniqueness strategy.

Constants

ACTIVEJOB_SUPPORTS_THROW_ABORT

github.com/rails/rails/pull/17227 groups.google.com/g/rubyonrails-core/c/mhD4T90g0G4

Attributes

job[R]
lock_key[R]
lock_ttl[R]
on_conflict[R]

Public Class Methods

new(lock_key:, lock_ttl: nil, on_conflict: nil, job: nil) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 16
def initialize(lock_key:, lock_ttl: nil, on_conflict: nil, job: nil)
  @lock_key = lock_key
  @lock_ttl = (lock_ttl || config.lock_ttl).to_i * 1000 # ms
  @on_conflict = on_conflict || config.on_conflict
  @job = job
end

Public Instance Methods

after_perform() click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 53
def after_perform
  # Expected to be overriden in the descendant strategy
end
around_enqueue(block) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 43
def around_enqueue(block)
  # Expected to be overriden in the descendant strategy
  block.call
end
around_perform(block) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 48
def around_perform(block)
  # Expected to be overriden in the descendant strategy
  block.call
end
before_enqueue() click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 35
def before_enqueue
  # Expected to be overriden in the descendant strategy
end
before_perform() click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 39
def before_perform
  # Expected to be overriden in the descendant strategy
end
lock(resource:, ttl:, event: :lock) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 23
def lock(resource:, ttl:, event: :lock)
  lock_manager.lock(resource, ttl).tap do |result|
    instrument(event, resource: resource, ttl: ttl) if result
  end
end
unlock(resource:, event: :unlock) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 29
def unlock(resource:, event: :unlock)
  lock_manager.delete_lock(resource).tap do
    instrument(event, resource: resource)
  end
end

Private Instance Methods

abort_job() click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 89
def abort_job
  @job_aborted = true # ActiveJob 4.2 workaround

  ACTIVEJOB_SUPPORTS_THROW_ABORT ? throw(:abort) : false
end
handle_conflict(on_conflict:, resource:, event: :conflict) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 80
def handle_conflict(on_conflict:, resource:, event: :conflict)
  case on_conflict
  when :log then instrument(event, resource: resource)
  when :raise then raise_not_unique_job_error(resource: resource, event: event)
  else
    on_conflict.call(job)
  end
end
instrument(action, payload = {}) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 95
def instrument(action, payload = {})
  ActiveSupport::Notifications.instrument "#{action}.active_job_uniqueness", payload.merge(job: job)
end
raise_not_unique_job_error(resource:, event:) click to toggle source
# File lib/active_job/uniqueness/strategies/base.rb, line 99
def raise_not_unique_job_error(resource:, event:)
  message = [
    job.class.name,
    "(Job ID: #{job.job_id})",
    "(Lock key: #{resource})",
    job.arguments.inspect
  ]

  message.unshift(event == :runtime_conflict ? 'Not unique runtime' : 'Not unique')

  raise JobNotUnique, message.join(' ')
end