Class: Sqeduler::Service

Inherits:
Object
  • Object
show all
Defined in:
lib/sqeduler/service.rb

Overview

Singleton class for configuring this Gem.

Constant Summary collapse

SCHEDULER_TIMEOUT =
60
MINIMUM_REDIS_VERSION =
"2.6.12"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configObject

Returns the value of attribute config.



11
12
13
# File 'lib/sqeduler/service.rb', line 11

def config
  @config
end

Class Method Details

.config_schedulerObject



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/sqeduler/service.rb', line 70

def config_scheduler
  if scheduling?
    logger.info "Initializing Sidekiq::Scheduler with schedule #{config.schedule_path}"
    ::Sidekiq::Scheduler.rufus_scheduler_options = {
      :trigger_lock => TriggerLock.new
    }
    ::Sidekiq.schedule = parse_schedule(config.schedule_path)
  else
    logger.warn "No schedule_path provided. Not starting Sidekiq::Scheduler."
  end
end

.config_sidekiq_clientObject



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/sqeduler/service.rb', line 51

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_serverObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/sqeduler/service.rb', line 31

def config_sidekiq_server
  logger.info "Initializing Sidekiq server"
  ::Sidekiq.configure_server do |config|
    setup_sidekiq_redis(config)
    if Service.scheduling?
      config.on(:shutdown) do
        # Make sure any scheduling locks are released on shutdown.
        Sidekiq::Scheduler.rufus_scheduler.stop
      end
    end

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

    Service.config.on_server_start.call(config) if Service.config.on_server_start
  end
end

.loggerObject



105
106
107
108
109
110
111
112
# File 'lib/sqeduler/service.rb', line 105

def logger
  return config.logger if config.logger
  if defined?(Rails)
    Rails.logger
  else
    fail ArgumentError, "No logger provided and Rails.logger cannot be inferred"
  end
end

.parse_schedule(path) ⇒ Object



82
83
84
85
86
# File 'lib/sqeduler/service.rb', line 82

def parse_schedule(path)
  fail "Schedule file #{path} does not exist!" unless File.exist?(path)
  file_contents = File.read(path)
  YAML.load(ERB.new(file_contents).result)
end

.redis_poolObject

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.



96
97
98
99
100
101
102
103
# File 'lib/sqeduler/service.rb', line 96

def redis_pool
  @redis_pool ||= begin
    redis = { :namespace => "sqeduler" }.merge(config.redis_hash)
    ::Sidekiq::RedisConnection.create(redis).tap do |redis_pool|
      verify_redis_pool(redis_pool)
    end
  end
end

.scheduling?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/sqeduler/service.rb', line 88

def scheduling?
  !config.schedule_path.to_s.empty?
end

.setup_sidekiq_redis(config) ⇒ Object



65
66
67
68
# File 'lib/sqeduler/service.rb', line 65

def setup_sidekiq_redis(config)
  return if Service.config.redis_hash.nil? || Service.config.redis_hash.empty?
  config.redis = Service.config.redis_hash
end

.startObject



13
14
15
16
17
18
# File 'lib/sqeduler/service.rb', line 13

def start
  fail "No config provided" unless config
  config_sidekiq_server
  config_sidekiq_client
  config_scheduler
end

.verify_redis_pool(redis_pool) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/sqeduler/service.rb', line 20

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)
      fail "Must be using redis >= #{MINIMUM_REDIS_VERSION}"
    end
    @verified = true
  end
end