refinery 0.9.12 → 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.12
1
+ 0.9.13
@@ -4,6 +4,7 @@ module Refinery #:nodoc:
4
4
  include Refinery::Loggable
5
5
  include Refinery::Configurable
6
6
  include Refinery::Utilities
7
+ include Refinery::Queueable
7
8
 
8
9
  RUNNING = 'running'
9
10
  STOPPED = 'stopped'
@@ -12,12 +13,10 @@ module Refinery #:nodoc:
12
13
  attr_reader :thread
13
14
  # The name of the daemon
14
15
  attr_reader :name
15
- # The queue for incoming messages to process
16
- attr_reader :waiting_queue
17
- # The queue for outgoing messages once they've been processed
18
- attr_reader :done_queue
19
- # The queue for error messages
20
- attr_reader :error_queue
16
+ # The settings for the daemon
17
+ attr_reader :settings
18
+ # The base queue name
19
+ attr_reader :queue_name
21
20
 
22
21
  # Stop the daemon
23
22
  def stop
@@ -52,56 +51,57 @@ module Refinery #:nodoc:
52
51
  # The settings hash may contain the following options:
53
52
  # * <tt>visibility</tt>: The time in seconds that the message is hidden
54
53
  # in the queue.
55
- def initialize(server, name, waiting_queue, error_queue, done_queue, settings={})
54
+ def initialize(server, name, queue_prefix='', settings={})
56
55
  Refinery::Server.logger.debug "Starting daemon"
57
56
 
58
57
  @server = server
59
58
  @name = name
60
- @waiting_queue = waiting_queue
61
- @error_queue = error_queue
62
- @done_queue = done_queue
59
+ @settings = settings
60
+
61
+ queue_name = settings['queue'] || name
62
+ queue_name = "#{queue_prefix}#{queue_name}"
63
+ logger.debug "Using queue #{queue_name}"
64
+ @queue_name = queue_name
63
65
 
64
66
  @thread = Thread.new(self) do |daemon|
65
67
  logger.debug "Running daemon thread: #{name} (settings: #{settings.inspect})"
66
68
  while(running?)
67
- begin
69
+ with_queue("#{queue_name}_waiting") do |waiting_queue|
68
70
  while (message = waiting_queue.receive(settings['visibility']))
69
71
  worker = load_worker_class(name).new(self)
70
72
  begin
71
73
  result, run_time = worker.run(decode_message(message.body))
72
74
  if result
73
- done_message = {
74
- 'host_info' => host_info,
75
- 'original' => message.body,
76
- 'run_time' => run_time
77
- }
78
- logger.debug "Sending 'done' message to #{done_queue.name}"
79
- done_queue.send_message(encode_message(done_message))
75
+ with_queue("#{queue_name}_done") do |done_queue|
76
+ done_message = {
77
+ 'host_info' => host_info,
78
+ 'original' => message.body,
79
+ 'run_time' => run_time
80
+ }
81
+ logger.debug "Sending 'done' message to #{done_queue.name}"
82
+ done_queue.send_message(encode_message(done_message))
83
+ end
80
84
 
81
85
  logger.debug "Deleting message from queue"
82
86
  message.delete()
83
87
  end
84
88
  rescue Exception => e
85
- error_message = {
86
- 'error' => {
87
- 'message' => e.message,
88
- 'class' => e.class.name
89
- },
90
- 'host_info' => host_info,
91
- 'original' => message.body
92
- }
93
- logger.error "Sending 'error' message to #{error_queue.name}: #{e.message}"
94
- error_queue.send_message(encode_message(error_message))
89
+ with_queue("#{queue_name}_error") do |error_queue|
90
+ error_message = {
91
+ 'error' => {
92
+ 'message' => e.message,
93
+ 'class' => e.class.name
94
+ },
95
+ 'host_info' => host_info,
96
+ 'original' => message.body
97
+ }
98
+ logger.error "Sending 'error' message to #{error_queue.name}: #{e.message}"
99
+ error_queue.send_message(encode_message(error_message))
100
+ end
95
101
  message.delete()
96
102
  end
97
103
  end
98
104
  sleep(settings['sleep'] || 5)
99
- rescue Exception => e
100
- logger.error "An error occurred while receiving from the waiting queue: #{e.message}"
101
- # delay to try to get past the issue with the queue
102
- sleep(30)
103
- # assign a new queue instance
104
- @waiting_queue = queue(waiting_queue.name)
105
105
  end
106
106
  end
107
107
  logger.debug "Exiting daemon thread"
@@ -51,9 +51,9 @@ module Refinery #:nodoc:
51
51
  raise RuntimeError, "No processor configuration found for #{key}" unless settings
52
52
  queue_name = settings['queue'] || key
53
53
  queue_name = "#{prefix}#{queue_name}"
54
- logger.debug "Using queue #{queue_name}_waiting"
55
- waiting_queue = queue("#{queue_name}_waiting")
56
- load_publisher_class(key).new(waiting_queue).execute
54
+ waiting_queue_name = "#{queue_name}_waiting"
55
+ logger.debug "Using queue #{waiting_queue_name}"
56
+ load_publisher_class(key).new(waiting_queue_name).execute
57
57
  end
58
58
 
59
59
  # Run the event publisher
@@ -85,13 +85,13 @@ module Refinery #:nodoc:
85
85
  logger.info "Creating publisher for #{key}"
86
86
  queue_name = settings['queue'] || key
87
87
  queue_name = "#{prefix}#{queue_name}"
88
- logger.debug "Using queue #{queue_name}_waiting"
89
- waiting_queue = queue("#{queue_name}_waiting")
88
+ waiting_queue_name = "#{queue_name}_waiting"
89
+ logger.debug "Using queue #{waiting_queue_name}"
90
90
 
91
- threads << Thread.new(waiting_queue, settings) do |waiting_queue, settings|
91
+ threads << Thread.new(waiting_queue_name, settings) do |waiting_queue_name, settings|
92
92
  while(running?)
93
93
  begin
94
- load_publisher_class(key).new(waiting_queue).execute
94
+ load_publisher_class(key).new(waiting_queue_name).execute
95
95
  rescue Exception => e
96
96
  logger.error e
97
97
  raise e
@@ -9,9 +9,9 @@ module Refinery #:nodoc:
9
9
  # Initialize the heartbeat for the given server.
10
10
  def initialize(server)
11
11
  @server = server
12
- @thread = Thread.new(queue('heartbeat')) do |heartbeat_queue|
12
+ @thread = Thread.new do
13
13
  loop do
14
- begin
14
+ with_queue('heartbeat') do |heartbeat_queue|
15
15
  logger.debug "Send heartbeat"
16
16
  message = {
17
17
  'host_info' => host_info,
@@ -20,9 +20,6 @@ module Refinery #:nodoc:
20
20
  }
21
21
  heartbeat_queue.send_message(Base64.encode64(message.to_json))
22
22
  sleep(60)
23
- rescue Exception => e
24
- logger.error "Error sending heartbeat: #{e.message}"
25
- sleep(30)
26
23
  end
27
24
  end
28
25
  end
@@ -49,15 +49,13 @@ module Refinery #:nodoc:
49
49
 
50
50
  def run_heartbeat_monitor
51
51
  logger.info "Starting heartbeat monitor"
52
- Thread.new(queue('heartbeat')) do |heartbeat_queue|
52
+ Thread.new('heartbeat') do |heartbeat_queue_name|
53
53
  loop do
54
- begin
54
+ with_queue(heartbeat_queue_name) do |heartbeat_queue|
55
55
  while (message = heartbeat_queue.receive)
56
56
  logger.debug decode_message(message.body).inspect
57
57
  message.delete()
58
58
  end
59
- rescue Exception => e
60
- logger.error e
61
59
  end
62
60
  sleep(5)
63
61
  end
@@ -69,9 +67,9 @@ module Refinery #:nodoc:
69
67
  queue_name = settings['queue'] || key
70
68
  done_queue_name = "#{queue_name}_done"
71
69
  logger.debug "Starting monitor for queue #{done_queue_name}"
72
- Thread.new(queue(done_queue_name)) do |done_queue|
70
+ Thread.new(done_queue_name) do |done_queue_name|
73
71
  loop do
74
- begin
72
+ with_queue(done_queue_name) do |done_queue|
75
73
  while (message = done_queue.receive)
76
74
  done_message = decode_message(message.body)
77
75
  processed = decode_message(done_message['original'])
@@ -79,10 +77,8 @@ module Refinery #:nodoc:
79
77
  message.delete()
80
78
  statistics.record_done(done_message)
81
79
  end
82
- rescue Exception => e
83
- logger.error e
80
+ sleep(5)
84
81
  end
85
- sleep(5)
86
82
  end
87
83
  end
88
84
  end
@@ -93,9 +89,9 @@ module Refinery #:nodoc:
93
89
  queue_name = settings['queue'] || key
94
90
  error_queue_name = "#{queue_name}_error"
95
91
  logger.info "Starting error monitor for queue #{error_queue_name}"
96
- Thread.new(queue(error_queue_name)) do |error_queue|
92
+ Thread.new(error_queue_name) do |error_queue_name|
97
93
  loop do
98
- begin
94
+ with(error_queue_name) do |error_queue|
99
95
  while (message = error_queue.receive)
100
96
  error_message = decode_message(message.body)
101
97
  processed = decode_message(error_message['original'])
@@ -103,8 +99,6 @@ module Refinery #:nodoc:
103
99
  message.delete()
104
100
  statistics.record_error(error_message)
105
101
  end
106
- rescue Exception => e
107
- logger.error e
108
102
  end
109
103
  sleep(5)
110
104
  end
@@ -2,23 +2,26 @@ module Refinery #:nodoc:
2
2
  # Base class for publishers to be implemented by subclasses.
3
3
  class Publisher
4
4
  include Refinery::Loggable
5
+ include Refinery::Queueable
5
6
 
6
7
  # Initialize the publisher with the queue to publish messages to.
7
- def initialize(waiting_queue)
8
- @waiting_queue = waiting_queue
8
+ def initialize(waiting_queue_name)
9
+ @waiting_queue_name = waiting_queue_name
9
10
  end
10
11
 
11
12
  protected
12
- # Get the publish queue
13
- def waiting_queue
14
- @waiting_queue
13
+ # Get the publish queue name
14
+ def waiting_queue_name
15
+ @waiting_queue_name
15
16
  end
16
17
 
17
18
  # Publish the message. The message will be converted to JSON and pushed
18
19
  # into the queue associated with the publisher.
19
20
  def publish(message)
20
- logger.debug "Publisher #{self.class.name} sending message: #{message.to_json}"
21
- waiting_queue.send_message(Base64.encode64(message.to_json))
21
+ with_queue(waiting_queue_name) do |waiting_queue|
22
+ logger.debug "Publisher #{self.class.name} sending message: #{message.to_json}"
23
+ waiting_queue.send_message(Base64.encode64(message.to_json))
24
+ end
22
25
  end
23
26
  end
24
27
  end
@@ -1,11 +1,23 @@
1
1
  module Refinery #:nodoc:
2
2
  # Mix this module in to classes that want to access a queue.
3
3
  module Queueable
4
+ include Loggable
5
+ include Configurable
4
6
  # Get a named queue
5
7
  def queue(name)
6
8
  queue_provider.queue(name)
7
9
  end
8
10
 
11
+ def with_queue(name, &block)
12
+ begin
13
+ yield queue(name)
14
+ rescue Exception => e
15
+ logger.error "Queue error: #{e.message}"
16
+ sleep(5)
17
+ retry
18
+ end
19
+ end
20
+
9
21
  protected
10
22
  # Get the queue provider. Defaults to RightAws::SqsGen2 running
11
23
  # in multi-thread mode.
@@ -60,19 +60,11 @@ module Refinery #:nodoc:
60
60
 
61
61
  private
62
62
  def execute_daemons
63
- prefix = config['prefix'] || ''
63
+ queue_prefix = config['prefix'] || ''
64
64
  config['processors'].each do |key, settings|
65
65
  logger.debug "Creating daemons for #{key}"
66
-
67
- queue_name = settings['queue'] || key
68
- queue_name = "#{prefix}#{queue_name}"
69
- logger.debug "Using queue #{queue_name}"
70
- waiting_queue = queue("#{queue_name}_waiting")
71
- error_queue = queue("#{queue_name}_error")
72
- done_queue = queue("#{queue_name}_done")
73
-
74
66
  1.upto(settings['workers']['initial']) do
75
- daemons << Refinery::Daemon.new(self, key, waiting_queue, error_queue, done_queue, settings)
67
+ daemons << Refinery::Daemon.new(self, key, queue_prefix, settings)
76
68
  end
77
69
 
78
70
  logger.debug "Running #{daemons.length} daemons"
data/refinery.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{refinery}
5
- s.version = "0.9.12"
5
+ s.version = "0.9.13"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Anthony Eden"]
9
- s.date = %q{2009-07-08}
9
+ s.date = %q{2009-07-09}
10
10
  s.description = %q{Process data in a distributed fashion.}
11
11
  s.email = %q{anthonyeden@gmail.com}
12
12
  s.executables = ["epub", "monitor", "pubnow", "refinery"]
@@ -6,26 +6,40 @@ class DaemonTest < Test::Unit::TestCase
6
6
  @waiting_queue = stub('Queue(waiting)')
7
7
  @error_queue = stub('Queue(error)')
8
8
  @done_queue = stub('Queue(done)')
9
+
10
+ Refinery::Daemon.any_instance.stubs(:queue).with(
11
+ 'sample_waiting').returns(@waiting_queue)
12
+ Refinery::Daemon.any_instance.stubs(:queue).with(
13
+ 'sample_error').returns(@error_queue)
14
+ Refinery::Daemon.any_instance.stubs(:queue).with(
15
+ 'sample_done').returns(@done_queue)
9
16
  end
10
17
  should "be startable" do
11
18
  @waiting_queue.stubs(:receive)
12
19
  assert_nothing_raised do
13
- daemon = Refinery::Daemon.new(@server, 'sample', @waiting_queue, @error_queue, @done_queue)
20
+ daemon = Refinery::Daemon.new(@server, 'sample')
14
21
  end
15
22
  end
16
23
  should "have logging" do
17
24
  @waiting_queue.stubs(:receive)
18
- daemon = Refinery::Daemon.new(@server, 'sample', @waiting_queue, @error_queue, @done_queue)
25
+ daemon = Refinery::Daemon.new(@server, 'sample')
19
26
  assert_not_nil daemon.logger
20
27
  end
21
28
  should "allow visibility setting" do
22
29
  @waiting_queue.expects(:receive).with(600)
23
- daemon = Refinery::Daemon.new(@server, 'sample', @waiting_queue, @error_queue, @done_queue, {'visibility' => 600})
30
+ daemon = Refinery::Daemon.new(@server, 'sample', '', {'visibility' => 600})
31
+ end
32
+ should "have a queue name" do
33
+ @waiting_queue.stubs(:receive)
34
+ Refinery::Daemon.any_instance.stubs(:queue).with(
35
+ 'prefix_sample_waiting').returns(@waiting_queue)
36
+ daemon = Refinery::Daemon.new(@server, 'sample', 'prefix_')
37
+ assert_equal 'prefix_sample', daemon.queue_name
24
38
  end
25
39
  context "that is started" do
26
40
  setup do
27
41
  @waiting_queue.stubs(:receive)
28
- @daemon = Refinery::Daemon.new(@server, 'sample', @waiting_queue, @error_queue, @done_queue)
42
+ @daemon = Refinery::Daemon.new(@server, 'sample')
29
43
  end
30
44
  should "have a state of running" do
31
45
  assert @daemon.running?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refinery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.9.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Eden
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-08 00:00:00 -04:00
12
+ date: 2009-07-09 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15