class Delayed::JobGroups::JobGroup
Public Class Methods
check_for_completion(job_group_id)
click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 55 def self.check_for_completion(job_group_id) # Optimization to avoid loading and locking the JobGroup when the group # still has pending jobs return if 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 69 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 50 def cancel Delayed::Job.enqueue(on_cancellation_job, on_cancellation_job_options || {}) if on_cancellation_job destroy end
enqueue(job, options = {})
click to toggle source
# File lib/delayed/job_groups/job_group.rb, line 34 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 25 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 40 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 82 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 78 def ready_for_completion? queueing_complete? && !JobGroup.has_pending_jobs?(id) && !blocked? end