Class: SolidQueue::RecurringExecution

Inherits:
Record
  • Object
show all
Defined in:
lib/solid_queue_mongoid/models/classes.rb,
lib/solid_queue_mongoid/models/recurring_execution.rb

Defined Under Namespace

Classes: AlreadyRecorded

Constant Summary

Constants inherited from Record

SolidQueue::Record::INDEX_HINTS

Class Method Summary collapse

Methods inherited from Record

create_or_find_by!, find_by!, index, index_specifications, index_specifications=, inherited, non_blocking_lock, supports_insert_conflict_target?, transaction, use_index

Class Method Details

.clear_in_batches(batch_size: 500) ⇒ Object



48
49
50
51
52
53
# File 'lib/solid_queue_mongoid/models/recurring_execution.rb', line 48

def clear_in_batches(batch_size: 500)
  loop do
    deleted = clearable.limit(batch_size).delete_all
    break if deleted.zero?
  end
end

.create_or_insert!(task_key:, run_at:, job_id: nil) ⇒ Object

Atomic insert — raises AlreadyRecorded on duplicate (same task_key + run_at).



40
41
42
43
44
45
46
# File 'lib/solid_queue_mongoid/models/recurring_execution.rb', line 40

def create_or_insert!(task_key:, run_at:, job_id: nil)
  create!(task_key: task_key, run_at: run_at, job_id: job_id)
rescue Mongoid::Errors::Validations, Mongo::Error::OperationFailure => e
  raise AlreadyRecorded if duplicate_key_error?(e)

  raise
end

.record(task_key, run_at, &block) ⇒ Object

Called by RecurringTask#enqueue_and_record. Wraps the block; records the execution only if the job was successfully enqueued.



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/solid_queue_mongoid/models/recurring_execution.rb', line 25

def record(task_key, run_at, &block)
  Mongoid.transaction do
    block.call.tap do |active_job|
      if active_job&.successfully_enqueued?
        create_or_insert!(
          task_key: task_key,
          run_at: run_at,
          job_id: active_job.provider_job_id
        )
      end
    end
  end
end