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