class Sqeduler::Service

Singleton class for configuring this Gem.

Constants

MINIMUM_REDIS_VERSION
SCHEDULER_TIMEOUT

Attributes

config[RW]

Public Class Methods

config_redis_pool() click to toggle source
# File lib/sqeduler/service.rb, line 100
def config_redis_pool
  redis_pool = if config.redis_pool
    config.redis_pool
  else
    # Redis requires config hash to have symbols as keys.
    redis = { :namespace => "sqeduler" }.merge(symbolize_keys(config.redis_hash))
    ::Sidekiq::RedisConnection.create(redis)
  end
  verify_redis_pool(redis_pool)
  redis_pool
end
config_sidekiq_client() click to toggle source
# File lib/sqeduler/service.rb, line 63
def config_sidekiq_client
  logger.info "Initializing Sidekiq client"
  ::Sidekiq.configure_client do |config|
    setup_sidekiq_redis(config)
    if Service.config.on_client_start
      Service.config.on_client_start.call(config)
    end

    config.client_middleware do |chain|
      chain.add(Sqeduler::Middleware::KillSwitch)
    end
  end
end
config_sidekiq_server() click to toggle source
# File lib/sqeduler/service.rb, line 30
def config_sidekiq_server
  logger.info "Initializing Sidekiq server"
  ::Sidekiq.configure_server do |config|
    setup_sidekiq_redis(config)
    if Service.scheduling?
      logger.info "Initializing Sidekiq::Scheduler with schedule #{::Sqeduler::Service.config.schedule_path}"

      config.on(:startup) do
        ::Sidekiq::Scheduler.rufus_scheduler_options = {
          :trigger_lock => TriggerLock.new
        }
        ::Sidekiq.schedule = ::Sqeduler::Service.parse_schedule(::Sqeduler::Service.config.schedule_path)
        ::Sidekiq::Scheduler.reload_schedule!
      end

      config.on(:shutdown) do
        # Make sure any scheduling locks are released on shutdown.
        ::Sidekiq::Scheduler.rufus_scheduler.stop
      end
    else
      logger.warn "No schedule_path provided. Not starting Sidekiq::Scheduler."
    end

    # the server can also enqueue jobs
    config.client_middleware do |chain|
      chain.add(Sqeduler::Middleware::KillSwitch)
    end

    LockMaintainer.new.run if Service.config.maintain_locks
    Service.config.on_server_start.call(config) if Service.config.on_server_start
  end
end
logger() click to toggle source
# File lib/sqeduler/service.rb, line 112
def logger
  return config.logger if config.logger
  return Rails.logger if defined?(Rails)
  raise ArgumentError, "No logger provided and Rails.logger cannot be inferred"
end
parse_schedule(path) click to toggle source
# File lib/sqeduler/service.rb, line 82
def parse_schedule(path)
  raise "Schedule file #{path} does not exist!" unless File.exist?(path)
  file_contents = File.read(path)
  YAML.load(ERB.new(file_contents).result)
end
redis_pool() click to toggle source

A singleton redis ConnectionPool for Sidekiq::Scheduler, Sqeduler::Worker::Synchronization, Sqeduler::Worker::KillSwitch. Should be separate from Sidekiq's so that we don't saturate the client and server connection pools.

# File lib/sqeduler/service.rb, line 96
def redis_pool
  @redis_pool ||= config_redis_pool
end
scheduling?() click to toggle source
# File lib/sqeduler/service.rb, line 88
def scheduling?
  !config.schedule_path.to_s.empty?
end
setup_sidekiq_redis(config) click to toggle source
# File lib/sqeduler/service.rb, line 77
def setup_sidekiq_redis(config)
  return if Service.config.redis_hash.nil? || Service.config.redis_hash.empty?
  config.redis = Service.config.redis_hash
end
start() click to toggle source
# File lib/sqeduler/service.rb, line 13
def start
  raise "No config provided" unless config
  config_sidekiq_server
  config_sidekiq_client
end
verify_redis_pool(redis_pool) click to toggle source
# File lib/sqeduler/service.rb, line 19
def verify_redis_pool(redis_pool)
  return @verified if defined?(@verified)
  redis_pool.with do |redis|
    version = redis.info["redis_version"]
    unless Gem::Version.new(version) >= Gem::Version.new(MINIMUM_REDIS_VERSION)
      raise "Must be using redis >= #{MINIMUM_REDIS_VERSION}"
    end
    @verified = true
  end
end

Private Class Methods

symbolize_keys(hash) click to toggle source
# File lib/sqeduler/service.rb, line 120
def symbolize_keys(hash)
  hash.map { |k, v| [k.to_sym, v] }.to_h
end