class Sidekiq::Dejavu::Manager

Attributes

scheduled_set[RW]
schedules[RW]

Public Class Methods

new(schedules = {}, scheduled_set = Sidekiq::ScheduledSet.new) click to toggle source
# File lib/sidekiq/dejavu/manager.rb, line 8
def initialize(schedules = {}, scheduled_set = Sidekiq::ScheduledSet.new)
  @schedules = schedules
  @scheduled_set = scheduled_set
end

Public Instance Methods

reload_schedule!() click to toggle source
# File lib/sidekiq/dejavu/manager.rb, line 13
def reload_schedule!
  clear_changed_schedules
  add_new_schedules
end
scheduled_jobs() click to toggle source
# File lib/sidekiq/dejavu/manager.rb, line 18
def scheduled_jobs
  scheduled_set.select { |job| job.item.has_key? 'schedule' }
end

Private Instance Methods

add_new_schedules() click to toggle source
# File lib/sidekiq/dejavu/manager.rb, line 46
def add_new_schedules
  existing = scheduled_jobs.map { |job| job.item['schedule'] }

  schedules.each do |name, options|
    next if existing.include? name

    args = Array(options['args'])
    interval = options['interval']
    first_run = valid_cron?(interval) ? next_timestamp(interval) : next_randomized_timestamp(interval)
    job = options.merge('args' => args, 'schedule' => name, 'at' => first_run)

    Sidekiq.logger.info "Scheduling #{name} for first run at #{Time.at first_run}."
    Sidekiq::Client.push(job)
  end
end
clear_changed_schedules() click to toggle source
# File lib/sidekiq/dejavu/manager.rb, line 24
def clear_changed_schedules
  scheduled_jobs.each do |job|
    item = job.item
    name = item['schedule']

    unless schedules.has_key? name
      Sidekiq.logger.info "Clearing schedule #{name} (not listed in config)."
      job.delete
      next
    end

    schedule_options = schedules[name]
    schedule_options['args'] = Array(schedule_options['args'])
    item_options = item.select { |k,v| schedule_options.keys.include? k }

    if item_options != schedule_options
      Sidekiq.logger.info "Clearing schedule #{name} (config changed)."
      job.delete
    end
  end
end