class SidekiqUniqueJobs::LockDigest
@author Mikael Henriksson <mikael@mhenrixon.com>
Handles uniqueness of sidekiq arguments
def self.call(item)
-
(String)
- a unique digest for the given arguments
Parameters:
-
item
(Hash
) -- a sidekiq job hash
def self.call(item) new(item).lock_digest end
def create_digest
-
(String)
- a unique digest
def create_digest digest = OpenSSL::Digest::MD5.hexdigest(dump_json(digestable_hash)) "#{lock_prefix}:#{digest}" end
def digestable_hash
-
(Hash)
- to use for digest
def digestable_hash @item.slice(CLASS, QUEUE, LOCK_ARGS, APARTMENT).tap do |hash| hash.delete(QUEUE) if unique_across_queues? hash.delete(CLASS) if unique_across_workers? end end
def initialize(item)
-
item
(Hash
) -- a Sidekiq job hash
def initialize(item) @item = item @worker_class = item[CLASS] @lock_args = item.slice(LOCK_ARGS, UNIQUE_ARGS).values.first # TODO: Deprecate UNIQUE_ARGS @lock_prefix = item.slice(LOCK_PREFIX, UNIQUE_PREFIX).values.first # TODO: Deprecate UNIQUE_PREFIX end
def lock_digest
-
(String)
- a unique digest
def lock_digest @lock_digest ||= create_digest end
def unique_across_queues?
-
(true, false)
-
def unique_across_queues? item[UNIQUE_ACROSS_QUEUES] || worker_options[UNIQUE_ACROSS_QUEUES] end
def unique_across_workers?
-
(true, false)
-
def unique_across_workers? item[UNIQUE_ACROSS_WORKERS] || worker_options[UNIQUE_ACROSS_WORKERS] end