redis-repeater 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/redis-repeater'
4
+ RedisRepeater::start(ARGV.empty? ? File.dirname(__FILE__) + '/../config' : ARGV[0])
@@ -0,0 +1,56 @@
1
+ require File.dirname(__FILE__) + '/redis-repeater/scheduler.rb'
2
+ require File.dirname(__FILE__) + '/redis-repeater/scheduler_job.rb'
3
+ require File.dirname(__FILE__) + '/redis-repeater/transfer_scheduler_job.rb'
4
+
5
+ require 'yaml'
6
+ require 'logger'
7
+ require 'fileutils'
8
+
9
+ require 'rubygems'
10
+ require 'redis'
11
+ require 'eventmachine'
12
+
13
+ module RedisRepeater
14
+
15
+ DefaultRedisHost = 'localhost'
16
+ DefaultRedisPort = 6380
17
+ LogDefaultFilename = File.dirname(__FILE__) + '/../log/redis-repeater.log'
18
+
19
+ def self.start(config_dir = File.dirname(__FILE__) + '/../config')
20
+
21
+ # Connect to redis
22
+ config = YAML::load File.open("#{config_dir}/config.yml")
23
+ redis_from = redis_configure(config, 'origin')
24
+ redis_to = redis_configure(config, 'destination')
25
+
26
+ # Load the queues from the config file
27
+ queues = YAML::load File.open("#{config_dir}/queues.yml")
28
+
29
+ # Logger
30
+ log_filename = config.has_key?('log') ? config['log'] : LogDefaultFilename
31
+ log_path = File.dirname(log_filename)
32
+ FileUtils.mkdir_p(log_path)
33
+ logger = Logger.new(log_filename)
34
+
35
+ # Load the queues into the scheduler
36
+ scheduler = Scheduler.new(logger)
37
+ queues.each do |name, timeout|
38
+ scheduler << TransferSchedulerJob.new(name, timeout, logger, redis_from, redis_to)
39
+ end
40
+
41
+ # Perform forever
42
+ scheduler.perform # TODO make configurable
43
+
44
+ end
45
+
46
+ def self.redis_configure(config, name)
47
+ host = DefaultRedisHost
48
+ port = DefaultRedisPort
49
+ if config.has_key?(name)
50
+ host = config[name]['host'] if config[name].has_key?('host')
51
+ port = config[name]['port'] if config[name].has_key?('port')
52
+ end
53
+ Redis.new(:host => host, :port => port)
54
+ end
55
+
56
+ end
@@ -0,0 +1,24 @@
1
+ module RedisRepeater
2
+
3
+ class Scheduler
4
+
5
+ def initialize(logger = nil)
6
+ @logger = logger
7
+ end
8
+
9
+ # When adding, we move through the current queue, and
10
+ # find the first one that is performing after we want to
11
+ def <<(job)
12
+ scheduler = self
13
+ EventMachine.run {
14
+ EventMachine::add_timer(job.timeout) { job.perform; scheduler << job }
15
+ }
16
+ end
17
+
18
+ def perform
19
+ @logger.info 'Running on schedule forever...'
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,24 @@
1
+ module RedisRepeater
2
+
3
+ class SchedulerJob
4
+
5
+ def initialize(name, timeout, logger)
6
+ @name = name
7
+ @timeout = timeout
8
+ @logger = logger
9
+ @next_allowed_performance = Time.now + timeout
10
+ end
11
+
12
+ def perform
13
+ puts "Performing #{self.name}"
14
+ end
15
+
16
+ def adjust_next_allowed_performance
17
+ @next_allowed_performance = Time.now + timeout
18
+ end
19
+
20
+ attr_reader :name, :timeout, :next_allowed_performance
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,24 @@
1
+ module RedisRepeater
2
+
3
+ # Move jobs from One Redis queue to the same queue on a different machine
4
+
5
+ class TransferSchedulerJob < SchedulerJob
6
+
7
+ def initialize(name, timeout, logger, redis_from, redis_to)
8
+ @redis_from = redis_from
9
+ @redis_to = redis_to
10
+ super(name, timeout, logger)
11
+ end
12
+
13
+ def perform
14
+ count = 0
15
+ while (item = @redis_from.lpop @name)
16
+ @redis_to.rpush(@name, item)
17
+ count += 1
18
+ end
19
+ @logger.debug "Transported #{count} items for #{@name}"
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,5 @@
1
+ module RedisRepeater
2
+
3
+ VERSION = [0, 0, 1]
4
+
5
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redis-repeater
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - John Crepezzi
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-09 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rspec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: eventmachine
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: Automatically move events from one redis queue to the same queue on another server
50
+ email: john@crepezzi.com
51
+ executables:
52
+ - redis-repeater
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - lib/redis-repeater/scheduler.rb
59
+ - lib/redis-repeater/scheduler_job.rb
60
+ - lib/redis-repeater/transfer_scheduler_job.rb
61
+ - lib/redis-repeater/version.rb
62
+ - lib/redis-repeater.rb
63
+ - bin/redis-repeater
64
+ has_rdoc: true
65
+ homepage: http://seejohnrun.github.com/redis-repeater/
66
+ licenses: []
67
+
68
+ post_install_message:
69
+ rdoc_options: []
70
+
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 3
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ requirements: []
92
+
93
+ rubyforge_project: redis-repeater
94
+ rubygems_version: 1.3.7
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: Redis Repeater
98
+ test_files: []
99
+