Class: ActiveJob::Uniqueness::Strategies::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/active_job/uniqueness/strategies/base.rb

Overview

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

Defined Under Namespace

Modules: LockingOnEnqueue

Constant Summary collapse

ACTIVEJOB_SUPPORTS_THROW_ABORT =
ActiveJob.gem_version >= Gem::Version.new('5.0')

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(job:) ⇒ Base

Returns a new instance of Base.



28
29
30
31
32
33
34
# File 'lib/active_job/uniqueness/strategies/base.rb', line 28

def initialize(job:)
  @lock_key = job.lock_key
  @lock_ttl = (job.lock_options[:lock_ttl] || config.lock_ttl).to_i * 1000 # ms
  @on_conflict = job.lock_options[:on_conflict] || config.on_conflict
  @on_redis_connection_error = job.lock_options[:on_redis_connection_error] || config.on_redis_connection_error
  @job = job
end

Instance Attribute Details

#jobObject (readonly)

Returns the value of attribute job.



14
15
16
# File 'lib/active_job/uniqueness/strategies/base.rb', line 14

def job
  @job
end

#lock_keyObject (readonly)

Returns the value of attribute lock_key.



14
15
16
# File 'lib/active_job/uniqueness/strategies/base.rb', line 14

def lock_key
  @lock_key
end

#lock_ttlObject (readonly)

Returns the value of attribute lock_ttl.



14
15
16
# File 'lib/active_job/uniqueness/strategies/base.rb', line 14

def lock_ttl
  @lock_ttl
end

#on_conflictObject (readonly)

Returns the value of attribute on_conflict.



14
15
16
# File 'lib/active_job/uniqueness/strategies/base.rb', line 14

def on_conflict
  @on_conflict
end

#on_redis_connection_errorObject (readonly)

Returns the value of attribute on_redis_connection_error.



14
15
16
# File 'lib/active_job/uniqueness/strategies/base.rb', line 14

def on_redis_connection_error
  @on_redis_connection_error
end

Class Method Details

.locks_on_enqueue?Boolean

Whether the strategy acquires its #lock_key at enqueue time.

Sidekiq queue/set cleanup only releases enqueue locks, so a strategy whose #lock_key is instead a runtime guard (e.g. :while_executing) must report false to avoid freeing the guard of a currently executing instance. Built-in enqueue-locking strategies signal this by including LockingOnEnqueue; a custom strategy that locks on enqueue by other means can override this method to return true.

Returns:

  • (Boolean)


24
25
26
# File 'lib/active_job/uniqueness/strategies/base.rb', line 24

def self.locks_on_enqueue?
  include?(LockingOnEnqueue)
end

Instance Method Details

#after_performObject



66
67
68
# File 'lib/active_job/uniqueness/strategies/base.rb', line 66

def after_perform
  # Expected to be overriden in the descendant strategy
end

#around_enqueue(block) ⇒ Object



56
57
58
59
# File 'lib/active_job/uniqueness/strategies/base.rb', line 56

def around_enqueue(block)
  # Expected to be overriden in the descendant strategy
  block.call
end

#around_perform(block) ⇒ Object



61
62
63
64
# File 'lib/active_job/uniqueness/strategies/base.rb', line 61

def around_perform(block)
  # Expected to be overriden in the descendant strategy
  block.call
end

#before_enqueueObject



48
49
50
# File 'lib/active_job/uniqueness/strategies/base.rb', line 48

def before_enqueue
  # Expected to be overriden in the descendant strategy
end

#before_performObject



52
53
54
# File 'lib/active_job/uniqueness/strategies/base.rb', line 52

def before_perform
  # Expected to be overriden in the descendant strategy
end

#lock(resource:, ttl:, event: :lock) ⇒ Object



36
37
38
39
40
# File 'lib/active_job/uniqueness/strategies/base.rb', line 36

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) ⇒ Object



42
43
44
45
46
# File 'lib/active_job/uniqueness/strategies/base.rb', line 42

def unlock(resource:, event: :unlock)
  lock_manager.delete_lock(resource).tap do
    instrument(event, resource: resource)
  end
end