DelayedCron
run cron jobs with sidekiq, delayed_job, resque, or sucker_punch
DEPENDENCIES:
- background process handler: sidekiq, delayed_job, resque, or sucker_punch
INSTALL
gem "delayed_cron", "~> 0.2.9"
USE IN MODEL
class Product < ActiveRecord::Base
...
# Define in Model
# * this is an alternative to the cron_jobs array in config
#
# OPTIONS: *optional
# - interval - override default_interval from setup
# - at - set time of day the cron should be run, timezone and seconds are optional
# - time_zone - override default time zone for this job
# - precision - set to :hourly to run job at an hourly interval instead of daily
#
# NOTE: only one of interval or at will be used, at will take precedence if
# both are specified
cron_job :some_method_to_run_as_cron, at: "00:00:00 -0400"
cron_job :some_hourly_job, at: "15:00", precision: :hourly
def self.some_method_to_run_as_cron
# this method will be run every every day at midnight
end
def self.some_hourly_job
# this method will be run hourly at fifteen minutes past the hour
end
...
end
CONFIGURE
DelayedCron.setup do |config|
# default interval to run cron jobs
config.default_interval = 10.minutes
# default time zone for scheduling `:at` jobs
# accepts an ActiveSupport or TZInfo time zone name
config.default_time_zone = "Eastern Time (US & Canada)"
# array of methods to run at the above configured interval
config.cron_jobs = [
"SomeClass.expensive_task", # will run at default interval
{ job: "AnotherClass.other_expensive_task", interval: 1.hour } # override default
]
end
NOTES:
- when using with sidekiq and rails there can be a config/initializer load order issue. Below is a fix to insure sidekiq is loaded first
Rails.application.config.after_initialize do
DelayedCron.setup do |config|
...
end
end
This initializes dealyed cron after all other initializers have loaded.
TO DO:
- add support for Resque