refinery 0.9.12 → 0.9.13

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