beetle 0.3.0.rc.10 → 0.3.0.rc.13
Sign up to get free protection for your applications and to get access to all the features.
- data/beetle.gemspec +5 -5
- data/examples/simple.rb +1 -1
- data/lib/beetle/client.rb +33 -12
- data/lib/beetle/handler.rb +1 -1
- data/lib/beetle/version.rb +1 -1
- data/lib/beetle.rb +1 -1
- data/test/beetle/client_test.rb +20 -2
- data/test/beetle/handler_test.rb +1 -1
- data/test/beetle/publisher_test.rb +2 -2
- data/test/beetle/subscriber_test.rb +2 -2
- metadata +26 -24
data/beetle.gemspec
CHANGED
@@ -35,16 +35,16 @@ Gem::Specification.new do |s|
|
|
35
35
|
s.add_runtime_dependency("uuid4r", [">= 0.1.2"])
|
36
36
|
s.add_runtime_dependency("bunny", ["= 0.7.8"])
|
37
37
|
s.add_runtime_dependency("redis", ["= 2.2.2"])
|
38
|
-
s.add_runtime_dependency("hiredis", ["= 0.
|
39
|
-
s.add_runtime_dependency("amq-client", ["= 0.
|
40
|
-
s.add_runtime_dependency("amq-protocol", ["= 0.
|
41
|
-
s.add_runtime_dependency("amqp", ["= 0.
|
38
|
+
s.add_runtime_dependency("hiredis", ["= 0.4.4"])
|
39
|
+
s.add_runtime_dependency("amq-client", ["= 0.9.1"])
|
40
|
+
s.add_runtime_dependency("amq-protocol", ["= 0.9.0"])
|
41
|
+
s.add_runtime_dependency("amqp", ["= 0.9.2"])
|
42
42
|
s.add_runtime_dependency("activesupport", [">= 2.3.4"])
|
43
43
|
s.add_runtime_dependency("eventmachine_httpserver", [">= 0.2.1"])
|
44
44
|
s.add_runtime_dependency("daemons", [">= 1.0.10"])
|
45
45
|
s.add_development_dependency("rake", [">= 0.8.7"])
|
46
46
|
s.add_development_dependency("mocha", [">= 0"])
|
47
|
-
s.add_development_dependency("rcov", ["
|
47
|
+
s.add_development_dependency("rcov", ["~> 0.9.10"])
|
48
48
|
s.add_development_dependency("cucumber", [">= 0.7.2"])
|
49
49
|
s.add_development_dependency("daemon_controller", [">= 0"])
|
50
50
|
end
|
data/examples/simple.rb
CHANGED
@@ -15,7 +15,7 @@ Beetle.config.logger.level = Logger::INFO
|
|
15
15
|
|
16
16
|
# setup client
|
17
17
|
client = Beetle::Client.new
|
18
|
-
client.register_queue(:test)
|
18
|
+
client.register_queue(:test, :arguments => {"x-message-ttl" => 60 * 1000})
|
19
19
|
client.register_message(:test)
|
20
20
|
|
21
21
|
# purge the test queue
|
data/lib/beetle/client.rb
CHANGED
@@ -149,9 +149,10 @@ module Beetle
|
|
149
149
|
|
150
150
|
# this is a convenience method to configure exchanges, queues, messages and handlers
|
151
151
|
# with a common set of options. allows one to call all register methods without the
|
152
|
-
# register_ prefix. returns self.
|
152
|
+
# register_ prefix. returns self. if the passed in block has no parameters, the block
|
153
|
+
# will be evaluated in the context of the client configurator.
|
153
154
|
#
|
154
|
-
# Example:
|
155
|
+
# Example: (block with config argument)
|
155
156
|
# client = Beetle.client.new.configure :exchange => :foobar do |config|
|
156
157
|
# config.queue :q1, :key => "foo"
|
157
158
|
# config.queue :q2, :key => "bar"
|
@@ -160,8 +161,24 @@ module Beetle
|
|
160
161
|
# config.handler :q1 { puts "got foo"}
|
161
162
|
# config.handler :q2 { puts "got bar"}
|
162
163
|
# end
|
163
|
-
|
164
|
-
|
164
|
+
#
|
165
|
+
# Example: (block without config argument)
|
166
|
+
# client = Beetle.client.new.configure :exchange => :foobar do
|
167
|
+
# queue :q1, :key => "foo"
|
168
|
+
# queue :q2, :key => "bar"
|
169
|
+
# message :foo
|
170
|
+
# message :bar
|
171
|
+
# handler :q1 { puts "got foo"}
|
172
|
+
# handler :q2 { puts "got bar"}
|
173
|
+
# end
|
174
|
+
#
|
175
|
+
def configure(options={}, &block)
|
176
|
+
configurator = Configurator.new(self, options)
|
177
|
+
if block.arity == 1
|
178
|
+
yield configurator
|
179
|
+
else
|
180
|
+
configurator.instance_eval &block
|
181
|
+
end
|
165
182
|
self
|
166
183
|
end
|
167
184
|
|
@@ -223,18 +240,22 @@ module Beetle
|
|
223
240
|
end
|
224
241
|
|
225
242
|
# traces queues without consuming them. useful for debugging message flow.
|
226
|
-
def trace(queue_names=self.queues.keys, &block)
|
243
|
+
def trace(queue_names=self.queues.keys, tracer=nil, &block)
|
227
244
|
queues_to_trace = self.queues.slice(*queue_names)
|
228
245
|
queues_to_trace.each do |name, opts|
|
229
246
|
opts.merge! :durable => false, :auto_delete => true, :amqp_name => queue_name_for_tracing(opts[:amqp_name])
|
230
247
|
end
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
248
|
+
tracer ||=
|
249
|
+
lambda do |msg|
|
250
|
+
puts "-----===== new message =====-----"
|
251
|
+
puts "SERVER: #{msg.server}"
|
252
|
+
puts "HEADER: #{msg.header.attributes[:headers].inspect}"
|
253
|
+
puts "EXCHANGE: #{msg.header.method.exchange}"
|
254
|
+
puts "KEY: #{msg.header.method.routing_key}"
|
255
|
+
puts "MSGID: #{msg.msg_id}"
|
256
|
+
puts "DATA: #{msg.data}"
|
257
|
+
end
|
258
|
+
register_handler(queue_names){|msg| tracer.call msg }
|
238
259
|
listen_queues(queue_names, &block)
|
239
260
|
end
|
240
261
|
|
data/lib/beetle/handler.rb
CHANGED
@@ -83,7 +83,7 @@ module Beetle
|
|
83
83
|
# called when handler execution raised an exception and no error callback was
|
84
84
|
# specified when the handler instance was created
|
85
85
|
def error(exception)
|
86
|
-
logger.error "Beetle: handler execution raised an exception: #{exception}"
|
86
|
+
logger.error "Beetle: handler execution raised an exception: #{exception.class}(#{exception.message})"
|
87
87
|
end
|
88
88
|
|
89
89
|
# called when message processing has finally failed (i.e., the number of allowed
|
data/lib/beetle/version.rb
CHANGED
data/lib/beetle.rb
CHANGED
@@ -40,7 +40,7 @@ module Beetle
|
|
40
40
|
# AMQP options for exchange creation
|
41
41
|
EXCHANGE_CREATION_KEYS = [:auto_delete, :durable, :internal, :nowait, :passive]
|
42
42
|
# AMQP options for queue creation
|
43
|
-
QUEUE_CREATION_KEYS = [:passive, :durable, :exclusive, :auto_delete, :no_wait]
|
43
|
+
QUEUE_CREATION_KEYS = [:passive, :durable, :exclusive, :auto_delete, :no_wait, :arguments]
|
44
44
|
# AMQP options for queue bindings
|
45
45
|
QUEUE_BINDING_KEYS = [:key, :no_wait]
|
46
46
|
# AMQP options for message publishing
|
data/test/beetle/client_test.rb
CHANGED
@@ -151,6 +151,16 @@ module Beetle
|
|
151
151
|
@client.configure(options) {|config| assert_equal 42, config}
|
152
152
|
end
|
153
153
|
|
154
|
+
test "configure should eval a passed block without arguments in the context of the configurator" do
|
155
|
+
options = {:exchange => :foobar}
|
156
|
+
m = "mock"
|
157
|
+
m.expects(:foo).returns(42)
|
158
|
+
Client::Configurator.expects(:new).with(@client, options).returns(m)
|
159
|
+
value = nil
|
160
|
+
@client.configure(options) { value = foo }
|
161
|
+
assert_equal 42, value
|
162
|
+
end
|
163
|
+
|
154
164
|
test "a configurator should forward all known registration methods to the client" do
|
155
165
|
options = {:foo => :bar}
|
156
166
|
config = Client::Configurator.new(@client, options)
|
@@ -353,7 +363,7 @@ module Beetle
|
|
353
363
|
client = Client.new
|
354
364
|
client.register_queue("test")
|
355
365
|
sub = client.send(:subscriber)
|
356
|
-
sub.expects(:register_handler).with(client.queues.keys, {}, nil).yields(
|
366
|
+
sub.expects(:register_handler).with(client.queues.keys, {}, nil).yields(message_stub_for_tracing)
|
357
367
|
sub.expects(:listen_queues)
|
358
368
|
client.stubs(:puts)
|
359
369
|
client.trace
|
@@ -369,11 +379,19 @@ module Beetle
|
|
369
379
|
client.register_queue("test")
|
370
380
|
client.register_queue("irrelevant")
|
371
381
|
sub = client.send(:subscriber)
|
372
|
-
sub.expects(:register_handler).with(["test"], {}, nil).yields(
|
382
|
+
sub.expects(:register_handler).with(["test"], {}, nil).yields(message_stub_for_tracing)
|
373
383
|
sub.expects(:listen_queues).with(["test"])
|
374
384
|
client.stubs(:puts)
|
375
385
|
client.trace(["test"])
|
376
386
|
end
|
377
387
|
|
388
|
+
def message_stub_for_tracing
|
389
|
+
header_stub = stub_everything("header")
|
390
|
+
header_stub.stubs(:method).returns(stub_everything("method"))
|
391
|
+
header_stub.stubs(:attributes).returns(stub_everything("attributes"))
|
392
|
+
msg_stub = stub_everything("message")
|
393
|
+
msg_stub.stubs(:header).returns(header_stub)
|
394
|
+
msg_stub
|
395
|
+
end
|
378
396
|
end
|
379
397
|
end
|
data/test/beetle/handler_test.rb
CHANGED
@@ -80,7 +80,7 @@ module Beetle
|
|
80
80
|
test "default implementation of error and process and failure and completed should not crash" do
|
81
81
|
handler = Handler.create(lambda {})
|
82
82
|
handler.process
|
83
|
-
handler.error('barfoo')
|
83
|
+
handler.error(StandardError.new('barfoo'))
|
84
84
|
handler.failure('razzmatazz')
|
85
85
|
handler.completed
|
86
86
|
end
|
@@ -224,12 +224,12 @@ module Beetle
|
|
224
224
|
end
|
225
225
|
|
226
226
|
test "binding a queue should create it using the config and bind it to the exchange with the name specified" do
|
227
|
-
@client.register_queue("some_queue", :exchange => "some_exchange", :key => "haha.#")
|
227
|
+
@client.register_queue("some_queue", :exchange => "some_exchange", :key => "haha.#", :arguments => {"foo" => "fighter"})
|
228
228
|
@pub.expects(:exchange).with("some_exchange").returns(:the_exchange)
|
229
229
|
q = mock("queue")
|
230
230
|
q.expects(:bind).with(:the_exchange, {:key => "haha.#"})
|
231
231
|
m = mock("Bunny")
|
232
|
-
m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false).returns(q)
|
232
|
+
m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false, :arguments => {"foo" => "fighter"}).returns(q)
|
233
233
|
@pub.expects(:bunny).returns(m)
|
234
234
|
|
235
235
|
@pub.send(:queue, "some_queue")
|
@@ -128,12 +128,12 @@ module Beetle
|
|
128
128
|
end
|
129
129
|
|
130
130
|
test "binding a queue should create it using the config and bind it to the exchange with the name specified" do
|
131
|
-
@client.register_queue("some_queue", "durable" => true, "exchange" => "some_exchange", "key" => "haha.#")
|
131
|
+
@client.register_queue("some_queue", "durable" => true, "exchange" => "some_exchange", "key" => "haha.#", "arguments" => {"schmu" => 5})
|
132
132
|
@sub.expects(:exchange).with("some_exchange").returns(:the_exchange)
|
133
133
|
q = mock("queue")
|
134
134
|
q.expects(:bind).with(:the_exchange, {:key => "haha.#"})
|
135
135
|
m = mock("MQ")
|
136
|
-
m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false).returns(q)
|
136
|
+
m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false, :arguments => {"schmu" => 5}).returns(q)
|
137
137
|
@sub.expects(:channel).returns(m)
|
138
138
|
|
139
139
|
@sub.send(:queue, "some_queue")
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beetle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 3659109081
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 0.3.0.rc.
|
11
|
+
- 13
|
12
|
+
version: 0.3.0.rc.13
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Stefan Kaes
|
@@ -21,7 +21,7 @@ autorequire:
|
|
21
21
|
bindir: bin
|
22
22
|
cert_chain: []
|
23
23
|
|
24
|
-
date:
|
24
|
+
date: 2012-03-06 00:00:00 +01:00
|
25
25
|
default_executable: beetle
|
26
26
|
dependencies:
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -80,12 +80,12 @@ dependencies:
|
|
80
80
|
requirements:
|
81
81
|
- - "="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
hash:
|
83
|
+
hash: 7
|
84
84
|
segments:
|
85
85
|
- 0
|
86
|
-
-
|
87
|
-
-
|
88
|
-
version: 0.
|
86
|
+
- 4
|
87
|
+
- 4
|
88
|
+
version: 0.4.4
|
89
89
|
type: :runtime
|
90
90
|
version_requirements: *id004
|
91
91
|
- !ruby/object:Gem::Dependency
|
@@ -96,12 +96,12 @@ dependencies:
|
|
96
96
|
requirements:
|
97
97
|
- - "="
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
hash:
|
99
|
+
hash: 57
|
100
100
|
segments:
|
101
101
|
- 0
|
102
|
-
-
|
103
|
-
-
|
104
|
-
version: 0.
|
102
|
+
- 9
|
103
|
+
- 1
|
104
|
+
version: 0.9.1
|
105
105
|
type: :runtime
|
106
106
|
version_requirements: *id005
|
107
107
|
- !ruby/object:Gem::Dependency
|
@@ -112,12 +112,12 @@ dependencies:
|
|
112
112
|
requirements:
|
113
113
|
- - "="
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
hash:
|
115
|
+
hash: 59
|
116
116
|
segments:
|
117
117
|
- 0
|
118
|
-
-
|
119
|
-
-
|
120
|
-
version: 0.
|
118
|
+
- 9
|
119
|
+
- 0
|
120
|
+
version: 0.9.0
|
121
121
|
type: :runtime
|
122
122
|
version_requirements: *id006
|
123
123
|
- !ruby/object:Gem::Dependency
|
@@ -128,12 +128,12 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
hash:
|
131
|
+
hash: 63
|
132
132
|
segments:
|
133
133
|
- 0
|
134
|
-
-
|
134
|
+
- 9
|
135
135
|
- 2
|
136
|
-
version: 0.
|
136
|
+
version: 0.9.2
|
137
137
|
type: :runtime
|
138
138
|
version_requirements: *id007
|
139
139
|
- !ruby/object:Gem::Dependency
|
@@ -220,12 +220,14 @@ dependencies:
|
|
220
220
|
requirement: &id013 !ruby/object:Gem::Requirement
|
221
221
|
none: false
|
222
222
|
requirements:
|
223
|
-
- -
|
223
|
+
- - ~>
|
224
224
|
- !ruby/object:Gem::Version
|
225
|
-
hash:
|
225
|
+
hash: 47
|
226
226
|
segments:
|
227
227
|
- 0
|
228
|
-
|
228
|
+
- 9
|
229
|
+
- 10
|
230
|
+
version: 0.9.10
|
229
231
|
type: :development
|
230
232
|
version_requirements: *id013
|
231
233
|
- !ruby/object:Gem::Dependency
|
@@ -373,7 +375,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
373
375
|
requirements: []
|
374
376
|
|
375
377
|
rubyforge_project:
|
376
|
-
rubygems_version: 1.
|
378
|
+
rubygems_version: 1.3.7
|
377
379
|
signing_key:
|
378
380
|
specification_version: 3
|
379
381
|
summary: High Availability AMQP Messaging with Redundant Queues
|