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.
- data/daemon_objects.gemspec +2 -2
- data/lib/daemon_objects.rb +1 -1
- data/lib/daemon_objects/amqp.rb +4 -0
- data/lib/daemon_objects/{amqp_support.rb → amqp/runner.rb} +4 -2
- data/lib/daemon_objects/amqp/worker.rb +56 -0
- data/lib/daemon_objects/base.rb +2 -1
- data/lib/daemon_objects/version.rb +1 -1
- data/spec/lib/daemon_objects/base_spec.rb +2 -0
- metadata +9 -5
data/daemon_objects.gemspec
CHANGED
@@ -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{
|
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($/)
|
data/lib/daemon_objects.rb
CHANGED
@@ -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
|
|
@@ -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
|
data/lib/daemon_objects/base.rb
CHANGED
@@ -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
|
@@ -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.
|
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-
|
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: ! '
|
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/
|
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:
|