daemon_objects 0.1.0 → 0.1.4

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.
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = DaemonObjects::VERSION
9
9
  spec.authors = ["Craig Israel"]
10
10
  spec.email = ["craig@theisraels.net"]
11
- spec.description = %q{ Object-oriented daemons}
11
+ spec.description = %q{ A light-weight approach to creating and managing daemons in an object-oriented way. Supports any type of daemon, but provides additional support for consuming AMQP queues. }
12
12
  spec.summary = %q{ Daemon objects provides an object-based interface to daemons}
13
- spec.homepage = ""
13
+ spec.homepage = "http://github.com/craigisrael/daemon_objects"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -7,8 +7,8 @@ require 'logger'
7
7
  module DaemonObjects; end
8
8
 
9
9
  require 'daemon_objects/loader'
10
+ require 'daemon_objects/amqp'
10
11
  require 'daemon_objects/base'
11
12
  require 'daemon_objects/consumer_base'
12
- require 'daemon_objects/amqp_support'
13
13
  require 'daemon_objects/railtie'
14
14
 
@@ -0,0 +1,4 @@
1
+ module DaemonObjects::Amqp; end
2
+
3
+ require 'daemon_objects/amqp/worker'
4
+ require 'daemon_objects/amqp/runner'
@@ -19,16 +19,18 @@ module DaemonObjects::AmqpSupport
19
19
  get_consumer,
20
20
  {
21
21
  :queue_name => queue,
22
+ :logger => logger,
22
23
  :arguments => arguments
23
24
  })
24
25
 
25
26
  worker.start
26
27
 
28
+ logger.info "AMQP worker started"
29
+
27
30
  Signal.trap("INT") do
28
- logger.info "Exiting process"
31
+ logger.info "Received signal 'INT'. Exiting process"
29
32
  connection.close { EventMachine.stop }
30
33
  end
31
-
32
34
  end
33
35
  end
34
36
  end
@@ -0,0 +1,56 @@
1
+ class DaemonObjects::Amqp::Worker
2
+ attr_accessor :queue_name, :exchange, :routing_key, :channel, :consumer, :arguments, :logger
3
+
4
+ DEFAULTS = {
5
+ :queue_name => AMQ::Protocol::EMPTY_STRING,
6
+ :exchange => nil,
7
+ :routing_key => AMQ::Protocol::EMPTY_STRING,
8
+ :arguments => nil
9
+ }
10
+
11
+ def initialize(channel, consumer, options={})
12
+ self.consumer = consumer
13
+ self.channel = channel
14
+
15
+ parse_options(DEFAULTS.merge(options))
16
+ end
17
+
18
+ def parse_options(options)
19
+ options.each do |k,v|
20
+ self.send("#{k}=", v) if self.respond_to?("#{k}=")
21
+ end
22
+ end
23
+
24
+ def channel=(value)
25
+ value.on_error(&method(:handle_channel_exception))
26
+ @channel = value
27
+ end
28
+
29
+ def start
30
+ queue = channel.queue(queue_name, :durable => true, :ack => true, :arguments => arguments)
31
+ queue.bind(exchange, :routing_key => routing_key) if exchange
32
+
33
+ queue.subscribe(:ack => true) do |metadata, payload|
34
+ handle_message(metadata, payload)
35
+
36
+ response_payload = consumer.get_response(payload, exception) if consumer.respond_to?(:get_response)
37
+ if response_payload
38
+ channel.default_exchange.publish(response_payload.to_json,
39
+ :routing_key => metadata.reply_to,
40
+ :correlation_id => metadata.message_id)
41
+ end
42
+ end
43
+ end
44
+
45
+ def handle_channel_exception(channel, channel_close)
46
+ raise StandardError, "ERROR channel-level exception: code = #{channel_close.reply_code}, message = #{channel_close.reply_text}"
47
+ end
48
+
49
+ def handle_message(metadata, payload)
50
+ consumer.handle_message (payload)
51
+ metadata.ack
52
+ rescue Exception => e
53
+ metadata.reject
54
+ logger.error "Error occurred handling message, the payload was: #{payload}, the error was: '#{e}'."
55
+ end
56
+ end
@@ -9,7 +9,8 @@ class DaemonObjects::Base
9
9
  self.queue = opts.delete(:queue_name)
10
10
  self.arguments["x-message-ttl"] = opts.delete(:ttl) if opts[:ttl]
11
11
  self.prefetch = opts.delete(:prefetch)
12
- self.worker_class = opts.delete(:worker_class)
12
+ self.worker_class = opts.delete(:worker_class) || DaemonObjects::Amqp::Worker
13
+ self.arguments.merge!(opts)
13
14
 
14
15
  logger.info "Configured to consume queue [#{queue}] at endpoint [#{endpoint}]"
15
16
  end
@@ -1,3 +1,3 @@
1
1
  module DaemonObjects
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -126,6 +126,7 @@ describe DaemonObjects::Base do
126
126
  MyWorker.should_receive(:new).
127
127
  with(channel, consumer, {
128
128
  :queue_name => 'queue',
129
+ :logger => MyDaemon.logger,
129
130
  :arguments => {}
130
131
  }).
131
132
  and_return(worker)
@@ -159,6 +160,7 @@ describe DaemonObjects::Base do
159
160
  MyWorker.should_receive(:new).
160
161
  with(channel, consumer, {
161
162
  :queue_name => 'queue',
163
+ :logger => MyDaemon.logger,
162
164
  :arguments => {}
163
165
  }).
164
166
  and_return(worker)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daemon_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-05 00:00:00.000000000 Z
12
+ date: 2013-09-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
@@ -123,7 +123,9 @@ dependencies:
123
123
  - - ! '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
- description: ! ' Object-oriented daemons'
126
+ description: ! ' A light-weight approach to creating and managing daemons in an object-oriented
127
+ way. Supports any type of daemon, but provides additional support for consuming
128
+ AMQP queues. '
127
129
  email:
128
130
  - craig@theisraels.net
129
131
  executables: []
@@ -139,7 +141,9 @@ files:
139
141
  - Rakefile
140
142
  - daemon_objects.gemspec
141
143
  - lib/daemon_objects.rb
142
- - lib/daemon_objects/amqp_support.rb
144
+ - lib/daemon_objects/amqp.rb
145
+ - lib/daemon_objects/amqp/runner.rb
146
+ - lib/daemon_objects/amqp/worker.rb
143
147
  - lib/daemon_objects/base.rb
144
148
  - lib/daemon_objects/consumer_base.rb
145
149
  - lib/daemon_objects/loader.rb
@@ -155,7 +159,7 @@ files:
155
159
  - spec/lib/daemon_objects_spec.rb
156
160
  - spec/spec_helper.rb
157
161
  - spec/support/stub_logger.rb
158
- homepage: ''
162
+ homepage: http://github.com/craigisrael/daemon_objects
159
163
  licenses:
160
164
  - MIT
161
165
  post_install_message: