daemon_objects 0.1.0 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: