Module: Resque::Scheduler::SchedulingExtensions

Included in:
Extension
Defined in:
lib/resque/scheduler/scheduling_extensions.rb

Instance Method Summary collapse

Instance Method Details

#all_schedulesObject

gets the schedules as it exists in redis



74
75
76
77
78
79
80
81
82
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 74

def all_schedules
  return nil unless redis.exists(:schedules)

  redis.hgetall(:schedules).tap do |h|
    h.each do |name, config|
      h[name] = decode(config)
    end
  end
end

#clean_schedulesObject

clean the schedules as it exists in redis, useful for first setup?



85
86
87
88
89
90
91
92
93
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 85

def clean_schedules
  if redis.exists(:schedules)
    redis.hkeys(:schedules).each do |key|
      remove_schedule(key) unless schedule_persisted?(key)
    end
  end
  @schedule = nil
  true
end

#fetch_schedule(name) ⇒ Object

retrive the schedule configuration for the given name



118
119
120
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 118

def fetch_schedule(name)
  decode(redis.hget(:schedules, name))
end

#reload_schedule!Object

reloads the schedule from redis



69
70
71
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 69

def reload_schedule!
  @schedule = all_schedules
end

#remove_schedule(name) ⇒ Object

remove a given schedule by name



127
128
129
130
131
132
133
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 127

def remove_schedule(name)
  redis.pipelined do
    redis.hdel(:schedules, name)
    redis.srem(:persisted_schedules, name)
    redis.sadd(:schedules_changed, name)
  end
end

#scheduleObject

Returns the schedule hash



63
64
65
66
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 63

def schedule
  @schedule ||= all_schedules
  @schedule || {}
end

#schedule=(schedule_hash) ⇒ Object

Accepts a new schedule configuration of the form:

{
  "MakeTea" => {
    "every" => "1m" },
  "some_name" => {
    "cron"        => "5/* * * *",
    "class"       => "DoSomeWork",
    "args"        => "work on this string",
    "description" => "this thing works it"s butter off" },
  ...
}

Hash keys can be anything and are used to describe and reference the scheduled job. If the “class” argument is missing, the key is used implicitly as “class” argument - in the “MakeTea” example, “MakeTea” is used both as job name and resque worker class.

Any jobs that were in the old schedule, but are not present in the new schedule, will be removed.

:cron can be any cron scheduling string

:every can be used in lieu of :cron. see rufus-scheduler’s ‘every’ usage for valid syntax. If :cron is present it will take precedence over :every.

:class must be a resque worker class. If it is missing, the job name (hash key) will be used as :class.

:args can be any yaml which will be converted to a ruby literal and passed in a params. (optional)

:rails_envs is the list of envs where the job gets loaded. Envs are comma separated (optional)

:description is just that, a description of the job (optional). If params is an array, each element in the array is passed as a separate param, otherwise params is passed in as the only parameter to perform.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 46

def schedule=(schedule_hash)
  # clean the schedules as it exists in redis
  clean_schedules

  schedule_hash = prepare_schedule(schedule_hash)

  # store all schedules in redis, so we can retrieve them back
  # everywhere.
  schedule_hash.each do |name, job_spec|
    set_schedule(name, job_spec)
  end

  # ensure only return the successfully saved data!
  reload_schedule!
end

#schedule_persisted?(name) ⇒ Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 122

def schedule_persisted?(name)
  redis.sismember(:persisted_schedules, name)
end

#set_schedule(name, config) ⇒ Object

Create or update a schedule with the provided name and configuration.

Note: values for class and custom_job_class need to be strings, not constants.

Resque.set_schedule('some_job', {:class => 'SomeJob',
                                 :every => '15mins',
                                 :queue => 'high',
                                 :args => '/tmp/poop'})


104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/resque/scheduler/scheduling_extensions.rb', line 104

def set_schedule(name, config)
  existing_config = fetch_schedule(name)
  persist = config.delete(:persist) || config.delete('persist')
  unless existing_config && existing_config == config
    redis.pipelined do
      redis.hset(:schedules, name, encode(config))
      redis.sadd(:schedules_changed, name)
      redis.sadd(:persisted_schedules, name) if persist
    end
  end
  config
end