march_hare 2.0.0.rc4-java → 2.0.0.rc5-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/march_hare/channel.rb +48 -6
- data/lib/march_hare/exceptions.rb +13 -1
- data/lib/march_hare/exchange.rb +28 -1
- data/lib/march_hare/queue.rb +7 -8
- data/lib/march_hare/session.rb +82 -2
- data/lib/march_hare/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3751b35f7f4b24f8b9025947c7434302377ddde
|
4
|
+
data.tar.gz: 9e704b59d72ff697d2719d763c8018cbbe7019cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1401bc111360744377a3d1eb46104caa6613bbc0607fd57edd02edefa1aaa3a556b6a95efc1f34f7f6f62bd56122fe80f59da9345f2c81679dedd49edce4b284
|
7
|
+
data.tar.gz: 30f4e4bf8d075b88595166cd7b6668f2cd119536478a622f6600bfb51da1a61b70112211c35985a3085c101df3d9908e06855314f97075eb49bb04cd7a60b6df
|
data/lib/march_hare/channel.rb
CHANGED
@@ -188,7 +188,7 @@ module MarchHare
|
|
188
188
|
|
189
189
|
self.recover_prefetch_setting
|
190
190
|
self.recover_exchanges
|
191
|
-
# this includes
|
191
|
+
# # this includes bindings recovery
|
192
192
|
self.recover_queues
|
193
193
|
self.recover_consumers
|
194
194
|
self.increment_recoveries_counter
|
@@ -218,7 +218,12 @@ module MarchHare
|
|
218
218
|
#
|
219
219
|
def recover_exchanges
|
220
220
|
@exchanges.values.each do |x|
|
221
|
-
|
221
|
+
begin
|
222
|
+
x.recover_from_network_failure
|
223
|
+
rescue Exception => e
|
224
|
+
# TODO: logger
|
225
|
+
$stderr.puts "Caught exception when recovering exchange #{x.name}"
|
226
|
+
end
|
222
227
|
end
|
223
228
|
end
|
224
229
|
|
@@ -226,7 +231,12 @@ module MarchHare
|
|
226
231
|
# Recovery feature.
|
227
232
|
def recover_queues
|
228
233
|
@queues.values.each do |q|
|
229
|
-
|
234
|
+
begin
|
235
|
+
q.recover_from_network_failure
|
236
|
+
rescue Exception => e
|
237
|
+
# TODO: logger
|
238
|
+
$stderr.puts "Caught exception when recovering queue #{q.name}"
|
239
|
+
end
|
230
240
|
end
|
231
241
|
end
|
232
242
|
|
@@ -234,14 +244,19 @@ module MarchHare
|
|
234
244
|
# Recovery feature.
|
235
245
|
def recover_consumers
|
236
246
|
@consumers.values.each do |c|
|
237
|
-
|
238
|
-
|
247
|
+
begin
|
248
|
+
self.unregister_consumer(c)
|
249
|
+
c.recover_from_network_failure
|
250
|
+
rescue Exception => e
|
251
|
+
# TODO: logger
|
252
|
+
$stderr.puts "Caught exception when recovering consumer #{c.consumer_tag}"
|
253
|
+
end
|
239
254
|
end
|
240
255
|
end
|
241
256
|
|
242
257
|
# @private
|
243
258
|
def increment_recoveries_counter
|
244
|
-
@recoveries_counter.
|
259
|
+
@recoveries_counter.increment_and_get
|
245
260
|
end
|
246
261
|
|
247
262
|
attr_reader :recoveries_counter
|
@@ -805,6 +820,12 @@ module MarchHare
|
|
805
820
|
self.add_return_listener(BlockReturnListener.from(block))
|
806
821
|
end
|
807
822
|
|
823
|
+
# Defines a publisher confirm handler
|
824
|
+
# @see http://rubymarchhare.info/articles/exchanges.html Exchanges and Publishers guide
|
825
|
+
def on_confirm(&block)
|
826
|
+
self.add_confirm_listener(BlockConfirmListener.from(block))
|
827
|
+
end
|
828
|
+
|
808
829
|
def method_missing(selector, *args)
|
809
830
|
@delegate.__send__(selector, *args)
|
810
831
|
end
|
@@ -814,6 +835,27 @@ module MarchHare
|
|
814
835
|
# Implementation
|
815
836
|
#
|
816
837
|
|
838
|
+
# @private
|
839
|
+
class BlockConfirmListener
|
840
|
+
include com.rabbitmq.client.ConfirmListener
|
841
|
+
|
842
|
+
def self.from(block)
|
843
|
+
new(block)
|
844
|
+
end
|
845
|
+
|
846
|
+
def initialize(block)
|
847
|
+
@block = block
|
848
|
+
end
|
849
|
+
|
850
|
+
def handleAck(delivery_tag, multiple)
|
851
|
+
@block.call(:ack, delivery_tag, multiple)
|
852
|
+
end
|
853
|
+
|
854
|
+
def handleNack(delivery_tag, multiple)
|
855
|
+
@block.call(:nack, delivery_tag, multiple)
|
856
|
+
end
|
857
|
+
end
|
858
|
+
|
817
859
|
# @private
|
818
860
|
class BlockReturnListener
|
819
861
|
include com.rabbitmq.client.ReturnListener
|
@@ -38,6 +38,9 @@ module MarchHare
|
|
38
38
|
|
39
39
|
# Raised when RabbitMQ closes network connection before
|
40
40
|
# finalizing the connection, typically indicating authentication failure.
|
41
|
+
#
|
42
|
+
# RabbitMQ versions beyond 3.2 use a better defined authentication failure
|
43
|
+
# notifications.
|
41
44
|
class PossibleAuthenticationFailureError < Exception
|
42
45
|
attr_reader :username, :vhost
|
43
46
|
|
@@ -45,10 +48,19 @@ module MarchHare
|
|
45
48
|
@username = username
|
46
49
|
@vhost = vhost
|
47
50
|
|
48
|
-
super("
|
51
|
+
super("Authentication with RabbitMQ failed or RabbitMQ version used does not support AMQP 0-9-1. Username: #{username}, vhost: #{vhost}, password length: #{password_length}. Please check your configuration.")
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
55
|
+
# Raised when RabbitMQ 3.2+ reports authentication
|
56
|
+
# failure before closing TCP connection.
|
57
|
+
class AuthenticationFailureError < PossibleAuthenticationFailureError
|
58
|
+
attr_reader :username, :vhost
|
59
|
+
|
60
|
+
def initialize(username, vhost, password_length)
|
61
|
+
super(username, vhost, password_length)
|
62
|
+
end
|
63
|
+
end
|
52
64
|
|
53
65
|
class PreconditionFailed < ChannelLevelException
|
54
66
|
end
|
data/lib/march_hare/exchange.rb
CHANGED
@@ -7,6 +7,7 @@ module MarchHare
|
|
7
7
|
#
|
8
8
|
# @see http://rubymarchhare.info/articles/exchanges.html Exchanges and Publishing guide
|
9
9
|
# @see http://rubymarchhare.info/articles/extensions.html RabbitMQ Extensions guide
|
10
|
+
# @see Queue#bind
|
10
11
|
class Exchange
|
11
12
|
# @return [String] Exchange name
|
12
13
|
attr_reader :name
|
@@ -17,6 +18,23 @@ module MarchHare
|
|
17
18
|
# @return [Symbol]
|
18
19
|
attr_reader :type
|
19
20
|
|
21
|
+
# Instantiates a new exchange.
|
22
|
+
#
|
23
|
+
# @param [Channel] channel Channel to declare exchange on
|
24
|
+
# @params [String] name Exchange name
|
25
|
+
# @params [Hash] options ({}) Exchange and declaration attributes
|
26
|
+
#
|
27
|
+
# @options opts :type [Symbol, String] Exchange type
|
28
|
+
# @options opts :durable [Boolean] (false) Will the exchange be durable?
|
29
|
+
# @options opts :auto_delete [Boolean] (false) Will the exchange be auto-deleted?
|
30
|
+
# @options opts :passive [Boolean] (false) Should passive declaration be used?
|
31
|
+
#
|
32
|
+
# @see MarchHare::Channel#default_exchange
|
33
|
+
# @see MarchHare::Channel#fanout
|
34
|
+
# @see MarchHare::Channel#topic
|
35
|
+
# @see MarchHare::Channel#direct
|
36
|
+
# @see MarchHare::Channel#headers
|
37
|
+
# @see MarchHare::Channel#exchange
|
20
38
|
def initialize(channel, name, options = {})
|
21
39
|
raise ArgumentError, "exchange channel cannot be nil" if channel.nil?
|
22
40
|
raise ArgumentError, "exchange name cannot be nil" if name.nil?
|
@@ -146,7 +164,16 @@ module MarchHare
|
|
146
164
|
# @private
|
147
165
|
def recover_from_network_failure
|
148
166
|
# puts "Recovering exchange #{@name} from network failure"
|
149
|
-
|
167
|
+
unless predefined?
|
168
|
+
begin
|
169
|
+
declare!
|
170
|
+
|
171
|
+
@channel.register_exchange(self)
|
172
|
+
rescue Exception => e
|
173
|
+
# TODO: use a logger
|
174
|
+
puts "Caught #{e.inspect} while redeclaring and registering exchange #{@name}!"
|
175
|
+
end
|
176
|
+
end
|
150
177
|
end
|
151
178
|
end
|
152
179
|
end
|
data/lib/march_hare/queue.rb
CHANGED
@@ -224,6 +224,11 @@ module MarchHare
|
|
224
224
|
# Implementation
|
225
225
|
#
|
226
226
|
|
227
|
+
# @return [Boolean] true if this queue is a pre-defined one (amq.direct, amq.fanout, amq.match and so on)
|
228
|
+
def predefined?
|
229
|
+
@name.start_with?("amq.")
|
230
|
+
end
|
231
|
+
|
227
232
|
# @private
|
228
233
|
def declare!
|
229
234
|
response = if @options[:passive]
|
@@ -242,15 +247,9 @@ module MarchHare
|
|
242
247
|
@channel.deregister_queue_named(old_name)
|
243
248
|
end
|
244
249
|
|
245
|
-
|
246
|
-
begin
|
247
|
-
declare!
|
250
|
+
declare! if !predefined?
|
248
251
|
|
249
|
-
|
250
|
-
rescue Exception => e
|
251
|
-
# TODO: use a logger
|
252
|
-
puts "Caught #{e.inspect} while redeclaring and registering #{@name}!"
|
253
|
-
end
|
252
|
+
@channel.register_queue(self)
|
254
253
|
recover_bindings
|
255
254
|
end
|
256
255
|
|
data/lib/march_hare/session.rb
CHANGED
@@ -6,6 +6,7 @@ require "march_hare/thread_pools"
|
|
6
6
|
module MarchHare
|
7
7
|
java_import com.rabbitmq.client.ConnectionFactory
|
8
8
|
java_import com.rabbitmq.client.Connection
|
9
|
+
java_import com.rabbitmq.client.BlockedListener
|
9
10
|
|
10
11
|
# Connection to a RabbitMQ node.
|
11
12
|
#
|
@@ -135,6 +136,11 @@ module MarchHare
|
|
135
136
|
end
|
136
137
|
alias connected? open?
|
137
138
|
|
139
|
+
# @return [Boolean] true if this channel is closed
|
140
|
+
def closed?
|
141
|
+
!@connection.open?
|
142
|
+
end
|
143
|
+
|
138
144
|
# Defines a shutdown event callback. Shutdown events are
|
139
145
|
# broadcasted when a connection is closed, either explicitly
|
140
146
|
# or forcefully, or due to a network/peer failure.
|
@@ -147,6 +153,22 @@ module MarchHare
|
|
147
153
|
sh
|
148
154
|
end
|
149
155
|
|
156
|
+
# Defines a connection.blocked handler
|
157
|
+
def on_blocked(&block)
|
158
|
+
self.add_blocked_listener(BlockBlockedUnblockedListener.for_blocked(block))
|
159
|
+
end
|
160
|
+
|
161
|
+
# Defines a connection.unblocked handler
|
162
|
+
def on_unblocked(&block)
|
163
|
+
self.add_blocked_listener(BlockBlockedUnblockedListener.for_unblocked(block))
|
164
|
+
end
|
165
|
+
|
166
|
+
# Clears all callbacks defined with #on_blocked and #on_unblocked.
|
167
|
+
def clear_blocked_connection_callbacks
|
168
|
+
@connection.clear_blocked_listeners
|
169
|
+
end
|
170
|
+
|
171
|
+
|
150
172
|
# @private
|
151
173
|
def add_automatic_recovery_hook
|
152
174
|
fn = Proc.new do |_, signal|
|
@@ -178,8 +200,25 @@ module MarchHare
|
|
178
200
|
@thread_pool = ThreadPools.dynamically_growing
|
179
201
|
self.recover_shutdown_hooks
|
180
202
|
|
181
|
-
|
182
|
-
|
203
|
+
# sorting channels by id means that the cases like the following:
|
204
|
+
#
|
205
|
+
# ch1 = conn.create_channel
|
206
|
+
# ch2 = conn.create_channel
|
207
|
+
#
|
208
|
+
# x = ch1.topic("logs", :durable => false)
|
209
|
+
# q = ch2.queue("", :exclusive => true)
|
210
|
+
#
|
211
|
+
# q.bind(x)
|
212
|
+
#
|
213
|
+
# will recover correctly because exchanges and queues will be recovered
|
214
|
+
# in the order the user expects and before bindings.
|
215
|
+
@channels.sort_by {|id, _| id}.each do |id, ch|
|
216
|
+
begin
|
217
|
+
ch.automatically_recover(self, @connection)
|
218
|
+
rescue Exception, java.io.IOException => e
|
219
|
+
# TODO: logging
|
220
|
+
$stderr.puts e
|
221
|
+
end
|
183
222
|
end
|
184
223
|
end
|
185
224
|
|
@@ -319,6 +358,8 @@ module MarchHare
|
|
319
358
|
raise ConnectionRefused.new("Connection to #{@cf.host}:#{@cf.port} refused")
|
320
359
|
rescue java.net.UnknownHostException => e
|
321
360
|
raise ConnectionRefused.new("Connection to #{@cf.host}:#{@cf.port} refused: host unknown")
|
361
|
+
rescue com.rabbitmq.client.AuthenticationFailureException => e
|
362
|
+
raise AuthenticationFailureError.new(@cf.username, @cf.virtual_host, @cf.password.bytesize)
|
322
363
|
rescue com.rabbitmq.client.PossibleAuthenticationFailureException => e
|
323
364
|
raise PossibleAuthenticationFailureError.new(@cf.username, @cf.virtual_host, @cf.password.bytesize)
|
324
365
|
end
|
@@ -356,5 +397,44 @@ module MarchHare
|
|
356
397
|
return Proc.new { MarchHare::ThreadPools.fixed_of_size(n) }
|
357
398
|
end
|
358
399
|
end
|
400
|
+
|
401
|
+
# Ruby blocks-based BlockedListener that handles
|
402
|
+
# connection.blocked and connection.unblocked.
|
403
|
+
# @private
|
404
|
+
class BlockBlockedUnblockedListener
|
405
|
+
include com.rabbitmq.client.BlockedListener
|
406
|
+
|
407
|
+
def self.for_blocked(block)
|
408
|
+
new(block, noop_fn1)
|
409
|
+
end
|
410
|
+
|
411
|
+
def self.for_unblocked(block)
|
412
|
+
new(noop_fn0, block)
|
413
|
+
end
|
414
|
+
|
415
|
+
# Returns a no-op function of arity 0.
|
416
|
+
def self.noop_fn0
|
417
|
+
Proc.new {}
|
418
|
+
end
|
419
|
+
|
420
|
+
# Returns a no-op function of arity 1.
|
421
|
+
def self.noop_fn1
|
422
|
+
Proc.new { |_| }
|
423
|
+
end
|
424
|
+
|
425
|
+
def initialize(on_blocked, on_unblocked)
|
426
|
+
@blocked = on_blocked
|
427
|
+
@unblocked = on_unblocked
|
428
|
+
end
|
429
|
+
|
430
|
+
def handle_blocked(reason)
|
431
|
+
@blocked.call(reason)
|
432
|
+
end
|
433
|
+
|
434
|
+
def handle_unblocked()
|
435
|
+
@unblocked.call()
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
359
439
|
end
|
360
440
|
end
|
data/lib/march_hare/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: march_hare
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc5
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Theo Hultberg
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-16 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: RabbitMQ client for JRuby built around the official RabbitMQ Java client
|
15
15
|
email:
|
@@ -56,8 +56,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
56
|
version: 1.3.1
|
57
57
|
requirements: []
|
58
58
|
rubyforge_project: march_hare
|
59
|
-
rubygems_version: 2.1.
|
59
|
+
rubygems_version: 2.1.9
|
60
60
|
signing_key:
|
61
61
|
specification_version: 4
|
62
62
|
summary: RabbitMQ client for JRuby built around the official RabbitMQ Java client
|
63
63
|
test_files: []
|
64
|
+
has_rdoc:
|