Module: Periodically

Defined in:
lib/periodically/cli.rb,
lib/periodically.rb,
lib/periodically/job.rb,
lib/periodically/debug.rb,
lib/periodically/defer.rb,
lib/periodically/model.rb,
lib/periodically/redis.rb

Overview

This file handles running Periodically in another process

Defined Under Namespace

Modules: Debug, Defer, Model Classes: CLI, Job, RedisConnection

Constant Summary collapse

REDIS_DEFAULTS =
{
  namespace: "periodically"
}
DEFAULT_ERROR_DELAY =
proc { |count| (count ** 4) + 15 + (rand(30)*(count+1)) }
@@registered =
[]

Class Method Summary collapse

Class Method Details

._registered_jobsObject



43
44
45
# File 'lib/periodically.rb', line 43

def self._registered_jobs
  @@registered
end

.execute_nextObject



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/periodically.rb', line 25

def self.execute_next
  found_job, instance = @@registered.lazy.filter_map do |job|
    instance = job.poll_next_instance
    [job, instance] if instance
  end.first

  if found_job && instance
    found_job.execute_instance(instance)
    true
  else
    false
  end
end

.loggerObject



17
18
19
# File 'lib/periodically.rb', line 17

def self.logger
  @logger ||= Logger.new(STDOUT)
end

.logger=(new_logger) ⇒ Object



14
15
16
# File 'lib/periodically.rb', line 14

def self.logger=(new_logger)
  @logger ||= new_logger
end

.redisObject

Raises:

  • (ArgumentError)


51
52
53
54
55
56
# File 'lib/periodically.rb', line 51

def self.redis
  raise ArgumentError, "requires a block" unless block_given?
  redis_pool.with do |conn|
    yield conn
  end
end

.redis_poolObject



47
48
49
# File 'lib/periodically.rb', line 47

def self.redis_pool
  @redis ||= Periodically::RedisConnection.create(REDIS_DEFAULTS)
end

.register(klass, method, opts) ⇒ Object



39
40
41
# File 'lib/periodically.rb', line 39

def self.register(klass, method, opts)
  @@registered.push(Periodically::Job.new(klass, method, opts))
end

.startObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/periodically.rb', line 58

def self.start
  Periodically.redis { |conn| conn.ping }
  
  Thread.new do
    while true
      executed = Periodically.execute_next
      if executed
        sleep 1.seconds
      else
        sleep 10.seconds
      end
    end
  end
end