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".freeze

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_redis_poolObject



101
102
103
104
105
106
107
108
109
110
# File 'lib/sqeduler/service.rb', line 101

def config_redis_pool
  redis_pool = if config.redis_pool
    config.redis_pool
  else
    redis = { :namespace => "sqeduler" }.merge(config.redis_hash)
    ::Sidekiq::RedisConnection.create(redis)
  end
  verify_redis_pool(redis_pool)
  redis_pool
end

.config_schedulerObject



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

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



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

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
50
# 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

    LockMaintainer.new.run if Service.config.maintain_locks
    Service.config.on_server_start.call(config) if Service.config.on_server_start
  end
end

.loggerObject



112
113
114
115
116
# File 'lib/sqeduler/service.rb', line 112

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

.parse_schedule(path) ⇒ Object



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

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.



97
98
99
# File 'lib/sqeduler/service.rb', line 97

def redis_pool
  @redis_pool ||= config_redis_pool
end

.scheduling?Boolean

Returns:

  • (Boolean)


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

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

.setup_sidekiq_redis(config) ⇒ Object



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

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