Module: Delayed::RecurringJob

Defined in:
lib/delayed/recurring_job.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



4
5
6
7
8
9
10
# File 'lib/delayed/recurring_job.rb', line 4

def self.included(base)
  base.extend(ClassMethods)
  base.class_eval do
    @@logger = Delayed::Worker.logger
    cattr_reader :logger
  end
end

Instance Method Details

#failureObject



12
13
14
# File 'lib/delayed/recurring_job.rb', line 12

def failure
  schedule!
end

#next_run_timeObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/delayed/recurring_job.rb', line 47

def next_run_time
  times = @schedule_options[:run_at]
  times = [times] unless times.is_a? Array
  times = times.map{|time| parse_time(time, @schedule_options[:timezone])}
  times = times.map{|time| time.in_time_zone @schedule_options[:timezone]} if @schedule_options[:timezone]

  interval = deserialize_duration(@schedule_options[:run_interval])

  until next_time = next_future_time(times)
    times.map!{ |time| time + interval }
  end

  # Update @schedule_options to avoid growing number of calculations each time
  @schedule_options[:run_at] = times

  next_time
end

#schedule!(options = {}) ⇒ Object

Schedule this “repeating” job



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/delayed/recurring_job.rb', line 21

def schedule! options = {}
  options = options.dup

  if run_every = options.delete(:run_every)
    options[:run_interval] = serialize_duration(run_every)
  end

  @schedule_options = options.reverse_merge(@schedule_options || {}).reverse_merge(
    run_at: self.class.run_at,
    timezone: self.class.timezone,
    run_interval: serialize_duration(self.class.run_every),
    priority: self.class.priority,
    queue: self.class.queue
  )
  enqueue_opts = { priority: @schedule_options[:priority], run_at: next_run_time }
  enqueue_opts[:queue] = @schedule_options[:queue] if @schedule_options[:queue]

  self.class.jobs(@schedule_options).destroy_all

  if Gem.loaded_specs['delayed_job'].version.to_s.first.to_i < 3
    Delayed::Job.enqueue self, enqueue_opts[:priority], enqueue_opts[:run_at]
  else
    Delayed::Job.enqueue self, enqueue_opts
  end
end

#successObject



16
17
18
# File 'lib/delayed/recurring_job.rb', line 16

def success
  schedule!
end