class Sidekiq::DeferredJobs::Jobs

Class for holding deferred jobs.

Public Class Methods

new() click to toggle source
# File lib/sidekiq/deferred_jobs.rb, line 165
def initialize
  @jobs = []
end

Public Instance Methods

clear!(filters = nil) click to toggle source

Clear any deferred jobs that match the filter. @filter [Array<Module>, Array<Hash>] Filter for jobs to clear

# File lib/sidekiq/deferred_jobs.rb, line 179
def clear!(filters = nil)
  filter = Filter.new(filters)
  cleared_jobs = @jobs.select { |job| filter.match?(job.klass, job.opts) }
  @jobs -= cleared_jobs
  cleared_jobs
end
defer(klass, args, opts = nil) click to toggle source

Add a job to the deferred job list. @param klass [Class] Sidekiq worker class. @param args [Array] Sidekiq job arguments @param opts [Hash, Nil] optional runtime jobs options

# File lib/sidekiq/deferred_jobs.rb, line 173
def defer(klass, args, opts = nil)
  @jobs << Job.new(klass, args&.dup, opts&.dup)
end
enqueue!(filters = nil) click to toggle source

Enqueue any deferred jobs that match the filter. @filter [Array<Module>, Array<Hash>] Filter for jobs to clear

# File lib/sidekiq/deferred_jobs.rb, line 188
def enqueue!(filters = nil)
  filter = Filter.new(filters)
  remaining_jobs = []
  begin
    duplicates = Set.new
    @jobs.each do |job|
      if filter.match?(job.klass, job.opts)
        if unique_job?(job.klass, job.opts)
          next if duplicates.include?([job.klass, job.args])
          duplicates << [job.klass, job.args]
        end
        if job.opts
          job.klass.set(job.opts).perform_async(*job.args)
        else
          job.klass.perform_async(*job.args)
        end
      else
        remaining_jobs << job
      end
    end
  ensure
    @jobs = remaining_jobs
  end
end

Private Instance Methods

unique_job?(klass, opts) click to toggle source

@return [Boolean] true if the worker support a uniqueness constraint

# File lib/sidekiq/deferred_jobs.rb, line 216
def unique_job?(klass, opts)
  enterprise_option = worker_options(klass, opts)["unique_for"] if defined?(Sidekiq::Enterprise)
  unique_jobs_option = worker_options(klass, opts)["lock"] if defined?(SidekiqUniqueJobs)

  if enterprise_option
    true
  elsif unique_jobs_option
    unique_jobs_option.to_s != "while_executing"
  else
    false
  end
end
worker_options(klass, opts) click to toggle source

Merge runtime options with the worker class sidekiq_options.

# File lib/sidekiq/deferred_jobs.rb, line 230
def worker_options(klass, opts)
  if opts
    klass.sidekiq_options.merge(opts.transform_keys(&:to_s))
  else
    klass.sidekiq_options
  end
end