march_hare 2.0.0.rc4-java → 2.0.0.rc5-java
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.
- 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:
|