class SidekiqUniqueJobs::LockDigest

@author Mikael Henriksson <mikael@mhenrixon.com>
Handles uniqueness of sidekiq arguments

def self.call(item)

Returns:
  • (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

Returns:
  • (String) - a unique digest
def create_digest
  digest = OpenSSL::Digest::MD5.hexdigest(dump_json(digestable_hash))
  "#{lock_prefix}:#{digest}"
end

def digestable_hash

Returns:
  • (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)

Parameters:
  • 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

Returns:
  • (String) - a unique digest
def lock_digest
  @lock_digest ||= create_digest
end

def unique_across_queues?

Returns:
  • (true, false) -
def unique_across_queues?
  item[UNIQUE_ACROSS_QUEUES] || worker_options[UNIQUE_ACROSS_QUEUES]
end

def unique_across_workers?

Returns:
  • (true, false) -
def unique_across_workers?
  item[UNIQUE_ACROSS_WORKERS] || worker_options[UNIQUE_ACROSS_WORKERS]
end