Module: Resque::Scheduler::SchedulingExtensions
- Included in:
- Extension
- Defined in:
- lib/resque/scheduler/scheduling_extensions.rb
Instance Method Summary collapse
-
#all_schedules ⇒ Object
gets the schedules as it exists in redis.
-
#clean_schedules ⇒ Object
clean the schedules as it exists in redis, useful for first setup?.
-
#fetch_schedule(name) ⇒ Object
retrive the schedule configuration for the given name.
-
#reload_schedule! ⇒ Object
reloads the schedule from redis.
-
#remove_schedule(name) ⇒ Object
remove a given schedule by name.
-
#schedule ⇒ Object
Returns the schedule hash.
-
#schedule=(schedule_hash) ⇒ Object
Accepts a new schedule configuration of the form:.
- #schedule_persisted?(name) ⇒ Boolean
-
#set_schedule(name, config) ⇒ Object
Create or update a schedule with the provided name and configuration.
Instance Method Details
#all_schedules ⇒ Object
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_schedules ⇒ Object
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 |
#schedule ⇒ Object
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
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 |