class Delayed::JobGroups::JobGroup

Public Class Methods

check_for_completion(job_group_id, skip_pending_jobs_check: false) click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 73
def self.check_for_completion(job_group_id, skip_pending_jobs_check: false)
  # Optimization to avoid loading and locking the JobGroup when the group
  # still has pending jobs
  return if !skip_pending_jobs_check && has_pending_jobs?(job_group_id)

  transaction do
    # The first completed job to notice the job group's queue count has dropped to
    # zero will queue the job group's completion job and destroy the job group so
    # other jobs need to handle the job group having been destroyed already.
    job_group = where(id: job_group_id).lock(true).first
    job_group.send(:complete) if job_group&.send(:ready_for_completion?)
  end
end
has_pending_jobs?(job_group_ids) click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 87
def self.has_pending_jobs?(job_group_ids) # rubocop:disable Naming/PredicateName
  job_group_ids = Array(job_group_ids)
  return false if job_group_ids.empty?

  Delayed::Job.where(job_group_id: job_group_ids, failed_at: nil).exists?
end

Public Instance Methods

cancel() click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 64
def cancel
  Delayed::Job.enqueue(on_cancellation_job, on_cancellation_job_options || {}) if on_cancellation_job
  destroy
end
check_for_completion(skip_pending_jobs_check: false) click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 69
def check_for_completion(skip_pending_jobs_check: false)
  self.class.check_for_completion(id, skip_pending_jobs_check: skip_pending_jobs_check)
end
enqueue(job, options = {}) click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 48
def enqueue(job, options = {})
  options = options.merge(job_group_id: id)
  options[:blocked] = blocked?
  Delayed::Job.enqueue(job, options)
end
mark_queueing_complete() click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 39
def mark_queueing_complete
  with_lock do
    raise 'JobGroup has already completed queueing' if queueing_complete?

    update_column(:queueing_complete, true)
    complete if ready_for_completion?
  end
end
unblock() click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 54
def unblock
  return unless blocked?

  with_lock do
    update_column(:blocked, false)
    active_jobs.update_all(blocked: false, run_at: Delayed::Job.db_time_now)
    complete if ready_for_completion?
  end
end

Private Instance Methods

complete() click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 100
def complete
  Delayed::Job.enqueue(on_completion_job, on_completion_job_options || {}) if on_completion_job
  destroy
end
ready_for_completion?() click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 96
def ready_for_completion?
  queueing_complete? && !JobGroup.has_pending_jobs?(id) && !blocked?
end