class SidekiqUniqueJobs::LockDigest
Handles uniqueness of sidekiq arguments
@author Mikael Henriksson <mikael@mhenrixon.com>
Attributes
@!attribute [r] args
@return [Array<Objet>] the arguments passed to `perform_async`
@!attribute [r] args
@return [String] the prefix for the unique key
Public Class Methods
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 21 def self.call(item) new(item).lock_digest end
Generates a new digest
@param [Hash] item a sidekiq job hash
@return [String] a unique digest for the given arguments
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 38 def initialize(item) @item = item @lock_args = item[LOCK_ARGS] || item[UNIQUE_ARGS] # TODO: Deprecate UNIQUE_ARGS @lock_prefix = item[LOCK_PREFIX] || item[UNIQUE_PREFIX] # TODO: Deprecate UNIQUE_PREFIX self.job_class = item[CLASS] end
@param [Hash] item a Sidekiq
job hash
Public Instance Methods
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 53 def create_digest digest = if SidekiqUniqueJobs.config.digest_algorithm == :legacy OpenSSL::Digest::MD5.hexdigest(dump_json(digestable_hash.sort)) else OpenSSL::Digest.new("SHA3-256", dump_json(digestable_hash.sort)).hexdigest end "#{lock_prefix}:#{digest}" end
Creates a namespaced unique digest based on the {#digestable_hash} and the {#lock_prefix} @return [String] a unique digest
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 65 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
Filter a hash to use for digest @return [Hash] to use for digest
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 47 def lock_digest @lock_digest ||= create_digest end
Memoized lock_digest
@return [String] a unique digest
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 74 def unique_across_queues? item[UNIQUE_ACROSS_QUEUES] || job_options[UNIQUE_ACROSS_QUEUES] end
Checks if we should disregard the queue when creating the unique digest @return [true, false]
Source
# File lib/sidekiq_unique_jobs/lock_digest.rb, line 80 def unique_across_workers? item[UNIQUE_ACROSS_WORKERS] || job_options[UNIQUE_ACROSS_WORKERS] end
Checks if we should disregard the worker when creating the unique digest @return [true, false]