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