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/locks.rb,
lib/periodically/model.rb,
lib/periodically/redis.rb,
lib/periodically/error_counts.rb,
lib/periodically/error_messages.rb

Overview

This file handles running Periodically in another process

Defined Under Namespace

Modules: Debug, Defer, ErrorCounts, ErrorMessages, Locks, 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



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

def self._registered_jobs
  @@registered
end

.execute_nextObject



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/periodically.rb', line 28

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



20
21
22
# File 'lib/periodically.rb', line 20

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

.logger=(new_logger) ⇒ Object



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

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

.redisObject

Raises:

  • (ArgumentError)


54
55
56
57
58
59
# File 'lib/periodically.rb', line 54

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

.redis_poolObject



50
51
52
# File 'lib/periodically.rb', line 50

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

.register(klass, method, opts) ⇒ Object



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

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

.startObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/periodically.rb', line 61

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