2013-01-31 17:42:19 +00:00
|
|
|
module Sidetiq
|
2013-02-04 12:11:46 +00:00
|
|
|
# Public: Mixin for Sidekiq::Worker classes.
|
|
|
|
#
|
|
|
|
# Examples
|
|
|
|
#
|
|
|
|
# class MyWorker
|
2013-03-11 17:11:37 +00:00
|
|
|
# include Sidekiq::Worker
|
|
|
|
# include Sidetiq::Schedulable
|
2013-02-04 12:11:46 +00:00
|
|
|
#
|
2013-03-11 17:11:37 +00:00
|
|
|
# # Daily at midnight
|
2013-07-30 11:32:36 +03:00
|
|
|
# recurrence { daily }
|
2013-03-11 17:11:37 +00:00
|
|
|
# end
|
2013-01-31 17:42:19 +00:00
|
|
|
module Schedulable
|
2013-09-17 16:48:41 +01:00
|
|
|
extend SubclassTracking
|
|
|
|
|
2013-01-31 17:42:19 +00:00
|
|
|
module ClassMethods
|
2013-09-17 16:48:41 +01:00
|
|
|
include SubclassTracking
|
|
|
|
|
|
|
|
attr_writer :schedule
|
2013-09-16 12:01:37 +01:00
|
|
|
|
2013-03-11 14:51:31 +00:00
|
|
|
# Public: Returns a Float timestamp of the last scheduled run.
|
2013-03-08 16:02:34 +00:00
|
|
|
def last_scheduled_occurrence
|
|
|
|
get_timestamp "last"
|
|
|
|
end
|
|
|
|
|
2013-09-17 16:48:41 +01:00
|
|
|
# Public: Returns the Sidetiq::Schedule for this worker.
|
|
|
|
def schedule
|
|
|
|
@schedule ||= Sidetiq::Schedule.new
|
|
|
|
end
|
|
|
|
|
2013-03-11 14:51:31 +00:00
|
|
|
# Public: Returns a Float timestamp of the next scheduled run.
|
2013-03-08 16:02:34 +00:00
|
|
|
def next_scheduled_occurrence
|
|
|
|
get_timestamp "next"
|
|
|
|
end
|
|
|
|
|
2014-04-27 14:23:50 +04:00
|
|
|
def schedule_description
|
|
|
|
get_schedulable_key("schedule_description")
|
|
|
|
end
|
|
|
|
|
2013-07-12 10:33:57 +01:00
|
|
|
def recurrence(options = {}, &block) # :nodoc:
|
2013-09-16 10:38:23 +01:00
|
|
|
schedule.instance_eval(&block)
|
|
|
|
schedule.set_options(options)
|
2014-04-27 14:23:50 +04:00
|
|
|
|
|
|
|
# deleting schedulable keys if schedule changed since last reccurence definition
|
2014-09-24 09:53:53 +01:00
|
|
|
if Sidekiq.server?
|
|
|
|
old_description = get_schedulable_key("schedule_description")
|
|
|
|
if old_description != schedule.to_s
|
|
|
|
get_schedulable_keys.map do |key|
|
|
|
|
Sidekiq.redis_pool.with { |r| r.del(key) }
|
|
|
|
end
|
|
|
|
set_schedulable_key("schedule_description", schedule.to_s)
|
2014-04-27 14:23:50 +04:00
|
|
|
end
|
|
|
|
end
|
2013-01-31 17:42:19 +00:00
|
|
|
end
|
2013-03-08 16:02:34 +00:00
|
|
|
|
2013-03-11 17:11:37 +00:00
|
|
|
private
|
2013-03-08 16:02:34 +00:00
|
|
|
|
2014-04-27 14:23:50 +04:00
|
|
|
def get_schedulable_keys
|
2014-06-10 16:52:26 -07:00
|
|
|
%w(next last schedule_description history).map { |key| "sidetiq:#{name}:#{key}" }
|
2014-04-27 14:23:50 +04:00
|
|
|
end
|
|
|
|
|
|
|
|
def get_schedulable_key(key)
|
2014-07-03 16:54:40 +06:00
|
|
|
Sidekiq.redis_pool.with { |r| r.get("sidetiq:#{name}:#{key}") }
|
2014-04-27 14:23:50 +04:00
|
|
|
end
|
|
|
|
|
|
|
|
def set_schedulable_key(key, value)
|
2014-07-03 16:54:40 +06:00
|
|
|
Sidekiq.redis_pool.with { |r| r.set("sidetiq:#{name}:#{key}", value) }
|
2014-04-27 14:23:50 +04:00
|
|
|
end
|
|
|
|
|
2013-03-08 16:07:25 +00:00
|
|
|
def get_timestamp(key)
|
2014-04-27 14:23:50 +04:00
|
|
|
(get_schedulable_key(key) || -1).to_f
|
2013-03-08 16:02:34 +00:00
|
|
|
end
|
2013-01-31 17:42:19 +00:00
|
|
|
end
|
|
|
|
|
2013-02-04 12:11:46 +00:00
|
|
|
def self.included(klass) # :nodoc:
|
2013-09-17 16:48:41 +01:00
|
|
|
super
|
|
|
|
|
2013-01-31 17:42:19 +00:00
|
|
|
klass.extend(Sidetiq::Schedulable::ClassMethods)
|
2013-09-17 16:48:41 +01:00
|
|
|
klass.extend(Sidetiq::SubclassTracking)
|
|
|
|
subclasses << klass
|
2013-01-31 17:42:19 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|