beetle 0.2.11 → 0.2.13
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +0 -1
- data/beetle.gemspec +8 -5
- data/features/support/env.rb +3 -1
- data/features/support/test_daemons/redis.conf.erb +2 -2
- data/lib/beetle.rb +2 -0
- data/lib/beetle/base.rb +1 -1
- data/lib/beetle/client.rb +16 -10
- data/lib/beetle/subscriber.rb +11 -8
- data/script/console~ +2 -0
- data/test/beetle/client_test.rb +30 -11
- data/test/beetle/subscriber_test.rb +9 -7
- data/test/test_helper.rb +6 -5
- metadata +67 -22
data/Rakefile
CHANGED
data/beetle.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "beetle"
|
3
|
-
s.version = "0.2.
|
4
|
-
s.required_rubygems_version = ">= 1.3.
|
3
|
+
s.version = "0.2.13"
|
4
|
+
s.required_rubygems_version = ">= 1.3.7"
|
5
5
|
s.authors = ["Stefan Kaes", "Pascal Friederich", "Ali Jelveh", "Sebastian Roebke"]
|
6
6
|
s.date = Time.now.strftime('%Y-%m-%d')
|
7
7
|
s.default_executable = "beetle"
|
@@ -28,15 +28,18 @@ Gem::Specification.new do |s|
|
|
28
28
|
INFO
|
29
29
|
|
30
30
|
s.specification_version = 3
|
31
|
-
s.add_runtime_dependency("uuid4r", [">= 0.1.
|
31
|
+
s.add_runtime_dependency("uuid4r", [">= 0.1.2"])
|
32
32
|
s.add_runtime_dependency("bunny", ["= 0.6.0"])
|
33
33
|
s.add_runtime_dependency("bunny-ext", [">= 0.6.5"])
|
34
34
|
s.add_runtime_dependency("redis", ["= 2.0.4"])
|
35
|
-
s.add_runtime_dependency("amqp", ["
|
36
|
-
s.add_runtime_dependency("activesupport", ["
|
35
|
+
s.add_runtime_dependency("amqp", ["~> 0.6.7"])
|
36
|
+
s.add_runtime_dependency("activesupport", [">= 2.3.4"])
|
37
37
|
s.add_runtime_dependency("daemons", [">= 1.0.10"])
|
38
|
+
s.add_development_dependency("rake", [">= 0.8.7"])
|
38
39
|
s.add_development_dependency("mocha", [">= 0"])
|
39
40
|
s.add_development_dependency("rcov", [">= 0"])
|
41
|
+
s.add_development_dependency("redgreen", [">= 0"])
|
42
|
+
s.add_development_dependency("wirble", [">= 0"])
|
40
43
|
s.add_development_dependency("cucumber", [">= 0.7.2"])
|
41
44
|
s.add_development_dependency("daemon_controller", [">= 0"])
|
42
45
|
end
|
data/features/support/env.rb
CHANGED
@@ -40,7 +40,9 @@ def first_redis_configuration_client_pid
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def system_notification_log_path
|
43
|
-
tmp_path + "/system_notifications.log"
|
43
|
+
log_path = tmp_path + "/system_notifications.log"
|
44
|
+
`touch #{log_path}` unless File.exists?(log_path)
|
45
|
+
log_path
|
44
46
|
end
|
45
47
|
|
46
48
|
def tmp_path
|
@@ -185,5 +185,5 @@ glueoutputbuf yes
|
|
185
185
|
# WARNING: object sharing is experimental, don't enable this feature
|
186
186
|
# in production before of Redis 1.0-stable. Still please try this feature in
|
187
187
|
# your development environment so that we can test it better.
|
188
|
-
shareobjects no
|
189
|
-
shareobjectspoolsize 1024
|
188
|
+
# shareobjects no
|
189
|
+
# shareobjectspoolsize 1024
|
data/lib/beetle.rb
CHANGED
data/lib/beetle/base.rb
CHANGED
@@ -53,7 +53,7 @@ module Beetle
|
|
53
53
|
queues[name] ||=
|
54
54
|
begin
|
55
55
|
opts = @client.queues[name]
|
56
|
-
|
56
|
+
raise UnknownQueue.new("You are trying to bind a queue #{name} which is not configured!") unless opts
|
57
57
|
logger.debug("Beetle: binding queue #{name} with internal name #{opts[:amqp_name]} on server #{@server}")
|
58
58
|
queue_name = opts[:amqp_name]
|
59
59
|
creation_options = opts.slice(*QUEUE_CREATION_KEYS)
|
data/lib/beetle/client.rb
CHANGED
@@ -189,12 +189,17 @@ module Beetle
|
|
189
189
|
publisher.purge(queue_name)
|
190
190
|
end
|
191
191
|
|
192
|
-
# start listening to
|
192
|
+
# start listening to all registered queues. Calls #listen_queues internally
|
193
193
|
# runs the given block before entering the eventmachine loop.
|
194
|
-
def listen(
|
195
|
-
|
196
|
-
|
197
|
-
|
194
|
+
def listen(_deprecated_messages=nil, &block)
|
195
|
+
raise Error.new("Beetle::Client#listen no longer works with arguments. Please use #listen_queues(['queue1', 'queue2']) instead") if _deprecated_messages
|
196
|
+
listen_queues(&block)
|
197
|
+
end
|
198
|
+
|
199
|
+
# start listening to a list of queues (default to all registered queues).
|
200
|
+
# runs the given block before entering the eventmachine loop.
|
201
|
+
def listen_queues(queues=self.queues.keys, &block)
|
202
|
+
subscriber.listen_queues(queues, &block)
|
198
203
|
end
|
199
204
|
|
200
205
|
# stops the eventmachine loop
|
@@ -207,19 +212,20 @@ module Beetle
|
|
207
212
|
publisher.stop
|
208
213
|
end
|
209
214
|
|
210
|
-
# traces
|
211
|
-
def trace(
|
212
|
-
queues.
|
215
|
+
# traces queues without consuming them. useful for debugging message flow.
|
216
|
+
def trace(queue_names=self.queues.keys, &block)
|
217
|
+
queues_to_trace = self.queues.slice(*queue_names)
|
218
|
+
queues_to_trace.each do |name, opts|
|
213
219
|
opts.merge! :durable => false, :auto_delete => true, :amqp_name => queue_name_for_tracing(opts[:amqp_name])
|
214
220
|
end
|
215
|
-
register_handler(
|
221
|
+
register_handler(queue_names) do |msg|
|
216
222
|
puts "-----===== new message =====-----"
|
217
223
|
puts "SERVER: #{msg.server}"
|
218
224
|
puts "HEADER: #{msg.header.inspect}"
|
219
225
|
puts "MSGID: #{msg.msg_id}"
|
220
226
|
puts "DATA: #{msg.data}"
|
221
227
|
end
|
222
|
-
|
228
|
+
listen_queues(queue_names, &block)
|
223
229
|
end
|
224
230
|
|
225
231
|
# evaluate the ruby files matching the given +glob+ pattern in the context of the client instance.
|
data/lib/beetle/subscriber.rb
CHANGED
@@ -14,26 +14,25 @@ module Beetle
|
|
14
14
|
@mqs = {}
|
15
15
|
end
|
16
16
|
|
17
|
-
# the client calls this method to subscribe to
|
18
|
-
#
|
19
|
-
# things:
|
17
|
+
# the client calls this method to subscribe to a list of queues.
|
18
|
+
# this method does the following things:
|
20
19
|
#
|
21
|
-
# * creates all exchanges which have been registered for the given
|
22
|
-
# * creates and binds
|
20
|
+
# * creates all exchanges which have been registered for the given queues
|
21
|
+
# * creates and binds each listed queue queues
|
23
22
|
# * subscribes the handlers for all these queues
|
24
23
|
#
|
25
24
|
# yields before entering the eventmachine loop (if a block was given)
|
26
|
-
def
|
25
|
+
def listen_queues(queues) #:nodoc:
|
27
26
|
EM.run do
|
28
|
-
exchanges =
|
27
|
+
exchanges = exchanges_for_queues(queues)
|
29
28
|
create_exchanges(exchanges)
|
30
|
-
queues = queues_for_exchanges(exchanges)
|
31
29
|
bind_queues(queues)
|
32
30
|
subscribe_queues(queues)
|
33
31
|
yield if block_given?
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
35
|
+
|
37
36
|
# closes all AMQP connections and stops the eventmachine loop
|
38
37
|
def stop! #:nodoc:
|
39
38
|
if @amqp_connections.empty?
|
@@ -53,6 +52,10 @@ module Beetle
|
|
53
52
|
|
54
53
|
private
|
55
54
|
|
55
|
+
def exchanges_for_queues(queues)
|
56
|
+
@client.bindings.slice(*queues).map{|_, opts| opts.map{|opt| opt[:exchange]}}.flatten.uniq
|
57
|
+
end
|
58
|
+
|
56
59
|
def exchanges_for_messages(messages)
|
57
60
|
@client.messages.slice(*messages).map{|_, opts| opts[:exchange]}.uniq
|
58
61
|
end
|
data/script/console~
ADDED
data/test/beetle/client_test.rb
CHANGED
@@ -261,18 +261,26 @@ module Beetle
|
|
261
261
|
|
262
262
|
test "should delegate listening to the subscriber instance" do
|
263
263
|
client = Client.new
|
264
|
-
client.register_queue(
|
265
|
-
client.
|
266
|
-
client.
|
267
|
-
client.
|
268
|
-
client.send(:subscriber).expects(:listen).with(["a", "b"]).yields
|
269
|
-
x = 0
|
270
|
-
client.listen([:a, "b"]) { x = 5 }
|
271
|
-
assert_equal 5, x
|
264
|
+
client.register_queue("b_queue")
|
265
|
+
client.register_queue("a_queue")
|
266
|
+
client.send(:subscriber).expects(:listen_queues).with {|value| value.include?("a_queue") && value.include?("b_queue")}.yields
|
267
|
+
client.listen
|
272
268
|
end
|
273
269
|
|
274
|
-
test "trying to listen to
|
275
|
-
assert_raises(
|
270
|
+
test "trying to listen to a message is no longer supported and should raise an exception" do
|
271
|
+
assert_raises(Error) { Client.new.listen([:a])}
|
272
|
+
end
|
273
|
+
|
274
|
+
test "should delegate listening to queues to the subscriber instance" do
|
275
|
+
client = Client.new
|
276
|
+
client.register_queue(:test)
|
277
|
+
client.send(:subscriber).expects(:listen_queues).with([:test]).yields
|
278
|
+
client.listen_queues([:test])
|
279
|
+
end
|
280
|
+
|
281
|
+
test "trying to listen to an unknown queue should raise an exception" do
|
282
|
+
client = Client.new
|
283
|
+
assert_raises(UnknownQueue) { Client.new.listen_queues([:foobar])}
|
276
284
|
end
|
277
285
|
|
278
286
|
test "should delegate stop_listening to the subscriber instance" do
|
@@ -314,7 +322,7 @@ module Beetle
|
|
314
322
|
client.register_queue("test")
|
315
323
|
sub = client.send(:subscriber)
|
316
324
|
sub.expects(:register_handler).with(client.queues.keys, {}, nil).yields(stub_everything("message"))
|
317
|
-
sub.expects(:
|
325
|
+
sub.expects(:listen_queues)
|
318
326
|
client.stubs(:puts)
|
319
327
|
client.trace
|
320
328
|
test_queue_opts = client.queues["test"]
|
@@ -324,5 +332,16 @@ module Beetle
|
|
324
332
|
assert !test_queue_opts[:durable]
|
325
333
|
end
|
326
334
|
|
335
|
+
test "limiting tracing to some queues" do
|
336
|
+
client = Client.new
|
337
|
+
client.register_queue("test")
|
338
|
+
client.register_queue("irrelevant")
|
339
|
+
sub = client.send(:subscriber)
|
340
|
+
sub.expects(:register_handler).with(["test"], {}, nil).yields(stub_everything("message"))
|
341
|
+
sub.expects(:listen_queues).with(["test"])
|
342
|
+
client.stubs(:puts)
|
343
|
+
client.trace(["test"])
|
344
|
+
end
|
345
|
+
|
327
346
|
end
|
328
347
|
end
|
@@ -249,14 +249,16 @@ module Beetle
|
|
249
249
|
assert_raises(Error){ @sub.send(:subscribe, "some_queue") }
|
250
250
|
end
|
251
251
|
|
252
|
-
test "
|
253
|
-
@client.
|
254
|
-
@client.
|
252
|
+
test "listeninging on queues should use eventmachine. create exchanges. bind queues. install subscribers. and yield." do
|
253
|
+
@client.register_exchange(:an_exchange)
|
254
|
+
@client.register_queue(:a_queue, :exchange => :an_exchange)
|
255
|
+
@client.register_message(:a_message, :key => "foo", :exchange => :an_exchange)
|
256
|
+
|
255
257
|
EM.expects(:run).yields
|
256
|
-
@sub.expects(:create_exchanges).with(["
|
257
|
-
@sub.expects(:bind_queues).with(["
|
258
|
-
@sub.expects(:subscribe_queues).with(["
|
259
|
-
@sub.
|
258
|
+
@sub.expects(:create_exchanges).with(["an_exchange"])
|
259
|
+
@sub.expects(:bind_queues).with(["a_queue"])
|
260
|
+
@sub.expects(:subscribe_queues).with(["a_queue"])
|
261
|
+
@sub.listen_queues(["a_queue"]) {}
|
260
262
|
end
|
261
263
|
end
|
262
264
|
|
data/test/test_helper.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'active_support'
|
3
|
-
require 'active_support/testing/declarative'
|
4
2
|
require 'test/unit'
|
3
|
+
require 'mocha'
|
4
|
+
require 'active_support/testing/declarative'
|
5
|
+
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/beetle')
|
7
|
+
|
5
8
|
begin
|
6
9
|
require 'redgreen' unless ENV['TM_FILENAME']
|
7
|
-
rescue
|
10
|
+
rescue LoadError => e
|
8
11
|
end
|
9
12
|
|
10
13
|
# we can remove this hack which is needed only for testing
|
@@ -17,8 +20,6 @@ rescue LoadError
|
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
20
|
-
require 'mocha'
|
21
|
-
require File.expand_path(File.dirname(__FILE__) + '/../lib/beetle')
|
22
23
|
|
23
24
|
class Test::Unit::TestCase
|
24
25
|
extend ActiveSupport::Testing::Declarative
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beetle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 13
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 13
|
10
|
+
version: 0.2.13
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Stefan Kaes
|
@@ -18,7 +18,7 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date: 2011-
|
21
|
+
date: 2011-05-15 00:00:00 +02:00
|
22
22
|
default_executable: beetle
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
@@ -29,12 +29,12 @@ dependencies:
|
|
29
29
|
requirements:
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
hash:
|
32
|
+
hash: 31
|
33
33
|
segments:
|
34
34
|
- 0
|
35
35
|
- 1
|
36
|
-
-
|
37
|
-
version: 0.1.
|
36
|
+
- 2
|
37
|
+
version: 0.1.2
|
38
38
|
type: :runtime
|
39
39
|
version_requirements: *id001
|
40
40
|
- !ruby/object:Gem::Dependency
|
@@ -91,7 +91,7 @@ dependencies:
|
|
91
91
|
requirement: &id005 !ruby/object:Gem::Requirement
|
92
92
|
none: false
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
hash: 9
|
97
97
|
segments:
|
@@ -107,7 +107,7 @@ dependencies:
|
|
107
107
|
requirement: &id006 !ruby/object:Gem::Requirement
|
108
108
|
none: false
|
109
109
|
requirements:
|
110
|
-
- -
|
110
|
+
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
hash: 11
|
113
113
|
segments:
|
@@ -134,21 +134,23 @@ dependencies:
|
|
134
134
|
type: :runtime
|
135
135
|
version_requirements: *id007
|
136
136
|
- !ruby/object:Gem::Dependency
|
137
|
-
name:
|
137
|
+
name: rake
|
138
138
|
prerelease: false
|
139
139
|
requirement: &id008 !ruby/object:Gem::Requirement
|
140
140
|
none: false
|
141
141
|
requirements:
|
142
142
|
- - ">="
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
hash:
|
144
|
+
hash: 49
|
145
145
|
segments:
|
146
146
|
- 0
|
147
|
-
|
147
|
+
- 8
|
148
|
+
- 7
|
149
|
+
version: 0.8.7
|
148
150
|
type: :development
|
149
151
|
version_requirements: *id008
|
150
152
|
- !ruby/object:Gem::Dependency
|
151
|
-
name:
|
153
|
+
name: mocha
|
152
154
|
prerelease: false
|
153
155
|
requirement: &id009 !ruby/object:Gem::Requirement
|
154
156
|
none: false
|
@@ -162,9 +164,51 @@ dependencies:
|
|
162
164
|
type: :development
|
163
165
|
version_requirements: *id009
|
164
166
|
- !ruby/object:Gem::Dependency
|
165
|
-
name:
|
167
|
+
name: rcov
|
166
168
|
prerelease: false
|
167
169
|
requirement: &id010 !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
hash: 3
|
175
|
+
segments:
|
176
|
+
- 0
|
177
|
+
version: "0"
|
178
|
+
type: :development
|
179
|
+
version_requirements: *id010
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
name: redgreen
|
182
|
+
prerelease: false
|
183
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
184
|
+
none: false
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
hash: 3
|
189
|
+
segments:
|
190
|
+
- 0
|
191
|
+
version: "0"
|
192
|
+
type: :development
|
193
|
+
version_requirements: *id011
|
194
|
+
- !ruby/object:Gem::Dependency
|
195
|
+
name: wirble
|
196
|
+
prerelease: false
|
197
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
198
|
+
none: false
|
199
|
+
requirements:
|
200
|
+
- - ">="
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
hash: 3
|
203
|
+
segments:
|
204
|
+
- 0
|
205
|
+
version: "0"
|
206
|
+
type: :development
|
207
|
+
version_requirements: *id012
|
208
|
+
- !ruby/object:Gem::Dependency
|
209
|
+
name: cucumber
|
210
|
+
prerelease: false
|
211
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
168
212
|
none: false
|
169
213
|
requirements:
|
170
214
|
- - ">="
|
@@ -176,11 +220,11 @@ dependencies:
|
|
176
220
|
- 2
|
177
221
|
version: 0.7.2
|
178
222
|
type: :development
|
179
|
-
version_requirements: *
|
223
|
+
version_requirements: *id013
|
180
224
|
- !ruby/object:Gem::Dependency
|
181
225
|
name: daemon_controller
|
182
226
|
prerelease: false
|
183
|
-
requirement: &
|
227
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
184
228
|
none: false
|
185
229
|
requirements:
|
186
230
|
- - ">="
|
@@ -190,7 +234,7 @@ dependencies:
|
|
190
234
|
- 0
|
191
235
|
version: "0"
|
192
236
|
type: :development
|
193
|
-
version_requirements: *
|
237
|
+
version_requirements: *id014
|
194
238
|
description: A highly available, reliable messaging infrastructure
|
195
239
|
email: developers@xing.com
|
196
240
|
executables:
|
@@ -243,6 +287,7 @@ files:
|
|
243
287
|
- features/support/test_daemons/redis_configuration_client.rb
|
244
288
|
- features/support/test_daemons/redis_configuration_server.rb
|
245
289
|
- script/console
|
290
|
+
- script/console~
|
246
291
|
- script/start_rabbit
|
247
292
|
- beetle.gemspec
|
248
293
|
- Rakefile
|
@@ -290,16 +335,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
290
335
|
requirements:
|
291
336
|
- - ">="
|
292
337
|
- !ruby/object:Gem::Version
|
293
|
-
hash:
|
338
|
+
hash: 21
|
294
339
|
segments:
|
295
340
|
- 1
|
296
341
|
- 3
|
297
|
-
-
|
298
|
-
version: 1.3.
|
342
|
+
- 7
|
343
|
+
version: 1.3.7
|
299
344
|
requirements: []
|
300
345
|
|
301
346
|
rubyforge_project:
|
302
|
-
rubygems_version: 1.
|
347
|
+
rubygems_version: 1.6.2
|
303
348
|
signing_key:
|
304
349
|
specification_version: 3
|
305
350
|
summary: High Availability AMQP Messaging with Redundant Queues
|