Class: SolidQueue::RecurringTask

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

Defined Under Namespace

Modules: Arguments

Constant Summary

Constants inherited from Record

SolidQueue::Record::INDEX_HINTS

Class Method Summary collapse

Instance 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

.create_dynamic_task(key, **options) ⇒ Object



53
54
55
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 53

def create_dynamic_task(key, **options)
  from_configuration(key, **options.merge(static: false)).save!
end

.create_or_update_all(tasks) ⇒ Object

Upsert all static tasks; used by Scheduler::RecurringSchedule#persist_tasks.



62
63
64
65
66
67
68
69
70
71
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 62

def create_or_update_all(tasks)
  tasks.each do |task|
    existing = where(key: task.key).first
    if existing
      existing.update!(task.attributes_for_upsert)
    else
      create!(task.attributes_for_upsert.merge(key: task.key))
    end
  end
end

.delete_dynamic_task(key) ⇒ Object



57
58
59
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 57

def delete_dynamic_task(key)
  RecurringTask.dynamic.find_by!(key: key).destroy
end

.from_configuration(key, **options) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 39

def from_configuration(key, **options)
  new(
    key: key,
    class_name: options[:class],
    command: options[:command],
    arguments: Array(options[:args]),
    schedule: options[:schedule],
    queue_name: options[:queue].presence,
    priority: options[:priority].presence,
    description: options[:description],
    static: options.fetch(:static, true)
  )
end

.wrap(args) ⇒ Object



35
36
37
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 35

def wrap(args)
  args.is_a?(self) ? args : from_configuration(args.first, **args.second)
end

Instance Method Details

#attributes_for_upsert ⇒ Object



117
118
119
120
121
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 117

def attributes_for_upsert
  attrs = attributes.except("_id", "id", "created_at", "updated_at")
  attrs.delete("key")
  attrs
end

#delay_from_now ⇒ Object



74
75
76
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 74

def delay_from_now
  [(next_time - Time.current).to_f, 0.1].max
end

#enqueue(at:) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 90

def enqueue(at:)
  SolidQueue.instrument(:enqueue_recurring_task, task: key, at: at) do |payload|
    active_job = if using_solid_queue_adapter?
                   enqueue_and_record(run_at: at)
                 else
                   payload[:other_adapter] = true
                   perform_later.tap do |job|
                     payload[:enqueue_error] = job.enqueue_error&.message unless job.successfully_enqueued?
                   end
                 end

    active_job.tap do |enqueued_job|
      payload[:active_job_id] = enqueued_job.job_id if enqueued_job
    end
  rescue RecurringExecution::AlreadyRecorded
    payload[:skipped] = true
    false
  rescue Job::EnqueueError => e
    payload[:enqueue_error] = e.message
    false
  end
end

#last_enqueued_time ⇒ Object



86
87
88
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 86

def last_enqueued_time
  recurring_executions.maximum(:run_at)
end

#next_time ⇒ Object



78
79
80
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 78

def next_time
  parsed_schedule.next_time.utc
end

#previous_time ⇒ Object



82
83
84
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 82

def previous_time
  parsed_schedule.previous_time.utc
end

#to_s ⇒ Object



113
114
115
# File 'lib/solid_queue_mongoid/models/recurring_task.rb', line 113

def to_s
  "#{class_name}.perform_later(#{arguments.map(&:inspect).join(",")}) [ #{parsed_schedule.original} ]"
end