Skip to content

Instantly share code, notes, and snippets.

@shreve
Created November 27, 2017 15:41
Show Gist options
  • Select an option

  • Save shreve/368aa73111279e34def79f9c4d709cd3 to your computer and use it in GitHub Desktop.

Select an option

Save shreve/368aa73111279e34def79f9c4d709cd3 to your computer and use it in GitHub Desktop.
Recurring job scheduling with ActiveJob
class ExampleJob < Job
schedule every: 30.minutes,
wait_until: Time.now.tomorrow.midnight
end
class Job < ActiveJob::Base
cattr_accessor :offline
after_perform do |job|
if self.class.recurring?
self.class.schedule
say("Scheduling another job in #{self.class.run_interval.inspect}")
end
end
private
def say(message)
::Job.log.info("[#{self.class.name}] #{message}")
end
class << self
attr_reader :run_interval
def schedule(options = {}, &block)
@run_interval = options.fetch(:every, nil)
schedule!(options, &block) unless offline? or already_scheduled?
end
def schedule!(options = {}, &block)
if options.has_key? :wait_until
self.set(options.slice(:wait_until)).perform_later
elsif recurring?
self.set(wait: run_interval).perform_later
else
self.perform_later
end
end
def offline?
Job.offline
end
def already_scheduled?
begin
Sidekiq::ScheduledSet.new.select do |job|
return true if job.display_class == self.name
end.any?
rescue Redis::CannotConnectError, SocketError
Job.offline = true
true
end
end
def recurring?
@run_interval.present?
end
def log
@logger ||= begin
logger = ::Logger.new(Rails.root.join('log', 'job.log').to_s)
logger.formatter = proc { |s, d, p, m| "[#{d}]#{m}\n" }
logger
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment