Class: Delayed::JobGroups::JobGroup

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/delayed/job_groups/job_group.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.check_for_completion(job_group_id) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/delayed/job_groups/job_group.rb', line 59

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 && job_group.send(:ready_for_completion?)
  end
end

.has_pending_jobs?(job_group_ids) ⇒ Boolean

rubocop:disable Naming/PredicateName

Returns:

  • (Boolean)


73
74
75
76
77
# File 'lib/delayed/job_groups/job_group.rb', line 73

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

Instance Method Details

#cancelObject



54
55
56
57
# File 'lib/delayed/job_groups/job_group.rb', line 54

def cancel
  Delayed::Job.enqueue(on_cancellation_job, on_cancellation_job_options || {}) if on_cancellation_job
  destroy
end

#enqueue(job, options = {}) ⇒ Object



38
39
40
41
42
# File 'lib/delayed/job_groups/job_group.rb', line 38

def enqueue(job, options = {})
  options = options.merge(job_group_id: id)
  options[:blocked] = blocked?
  Delayed::Job.enqueue(job, options)
end

#mark_queueing_completeObject



30
31
32
33
34
35
36
# File 'lib/delayed/job_groups/job_group.rb', line 30

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

#unblockObject



44
45
46
47
48
49
50
51
52
# File 'lib/delayed/job_groups/job_group.rb', line 44

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