hot_bunnies 1.5.0-java → 2.0.0.pre1-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.
- data/lib/ext/rabbitmq-client.jar +0 -0
- data/lib/hot_bunnies/channel.rb +287 -9
- data/lib/hot_bunnies/consumers.rb +152 -0
- data/lib/hot_bunnies/exceptions.rb +151 -0
- data/lib/hot_bunnies/exchange.rb +22 -30
- data/lib/hot_bunnies/juc.rb +9 -0
- data/lib/hot_bunnies/metadata.rb +90 -0
- data/lib/hot_bunnies/queue.rb +52 -265
- data/lib/hot_bunnies/session.rb +170 -0
- data/lib/hot_bunnies/version.rb +1 -1
- data/lib/hot_bunnies.rb +5 -91
- metadata +15 -39
- data/.gitignore +0 -7
- data/.rvmrc +0 -1
- data/.travis.yml +0 -12
- data/ChangeLog.md +0 -46
- data/Gemfile +0 -10
- data/LICENSE +0 -20
- data/README.md +0 -58
- data/Rakefile +0 -6
- data/examples/blocking_subscription.rb +0 -36
- data/examples/non_blocking_subscription.rb +0 -32
- data/examples/non_blocking_subscription_with_executor.rb +0 -38
- data/hot_bunnies.gemspec +0 -24
- data/spec/integration/alternate_exchanges_spec.rb +0 -36
- data/spec/integration/basic_consume_spec.rb +0 -128
- data/spec/integration/connection_spec.rb +0 -26
- data/spec/integration/error_handling_by_consumers_spec.rb +0 -97
- data/spec/integration/exchange_bind_spec.rb +0 -35
- data/spec/integration/exchange_declare_spec.rb +0 -113
- data/spec/integration/message_metadata_access_spec.rb +0 -94
- data/spec/integration/publisher_confirmations_spec.rb +0 -51
- data/spec/integration/queue_bind_spec.rb +0 -56
- data/spec/integration/queue_declare_spec.rb +0 -44
- data/spec/integration/queue_delete_spec.rb +0 -23
- data/spec/integration/queue_purge_spec.rb +0 -38
- data/spec/integration/queue_unbind_spec.rb +0 -53
- data/spec/integration/sender_selected_distribution_spec.rb +0 -47
- data/spec/spec_helper.rb +0 -18
@@ -0,0 +1,90 @@
|
|
1
|
+
module HotBunnies
|
2
|
+
class Headers
|
3
|
+
attr_reader :channel, :consumer_tag, :envelope, :properties
|
4
|
+
|
5
|
+
def initialize(channel, consumer_tag, envelope, properties)
|
6
|
+
@channel = channel
|
7
|
+
@consumer_tag = consumer_tag
|
8
|
+
@envelope = envelope
|
9
|
+
@properties = properties
|
10
|
+
end
|
11
|
+
|
12
|
+
def ack(options={})
|
13
|
+
@channel.basic_ack(delivery_tag, options.fetch(:multiple, false))
|
14
|
+
end
|
15
|
+
|
16
|
+
def reject(options={})
|
17
|
+
@channel.basic_reject(delivery_tag, options.fetch(:requeue, false))
|
18
|
+
end
|
19
|
+
|
20
|
+
begin :envelope_delegation
|
21
|
+
[
|
22
|
+
:delivery_tag,
|
23
|
+
:routing_key,
|
24
|
+
:redeliver,
|
25
|
+
:exchange
|
26
|
+
].each do |envelope_property|
|
27
|
+
define_method(envelope_property) { @envelope.__send__(envelope_property) }
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :redelivered?, :redeliver
|
31
|
+
end
|
32
|
+
|
33
|
+
begin :message_properties_delegation
|
34
|
+
[
|
35
|
+
:content_encoding,
|
36
|
+
:content_type,
|
37
|
+
:content_encoding,
|
38
|
+
:headers,
|
39
|
+
:delivery_mode,
|
40
|
+
:priority,
|
41
|
+
:correlation_id,
|
42
|
+
:reply_to,
|
43
|
+
:expiration,
|
44
|
+
:message_id,
|
45
|
+
:timestamp,
|
46
|
+
:type,
|
47
|
+
:user_id,
|
48
|
+
:app_id,
|
49
|
+
:cluster_id
|
50
|
+
].each do |properties_property|
|
51
|
+
define_method(properties_property) { @properties.__send__(properties_property) }
|
52
|
+
end # each
|
53
|
+
end
|
54
|
+
|
55
|
+
def persistent?
|
56
|
+
delivery_mode == 2
|
57
|
+
end
|
58
|
+
|
59
|
+
def redelivered?
|
60
|
+
redeliver
|
61
|
+
end
|
62
|
+
|
63
|
+
def redelivery?
|
64
|
+
redeliver
|
65
|
+
end
|
66
|
+
end # Headers
|
67
|
+
|
68
|
+
|
69
|
+
class BasicPropertiesBuilder
|
70
|
+
def self.build_properties_from(props = {})
|
71
|
+
builder = AMQP::BasicProperties::Builder.new
|
72
|
+
|
73
|
+
builder.content_type(props[:content_type]).
|
74
|
+
content_encoding(props[:content_encoding]).
|
75
|
+
headers(props[:headers]).
|
76
|
+
delivery_mode(props[:persistent] ? 2 : 1).
|
77
|
+
priority(props[:priority]).
|
78
|
+
correlation_id(props[:correlation_id]).
|
79
|
+
reply_to(props[:reply_to]).
|
80
|
+
expiration(if props[:expiration] then props[:expiration].to_s end).
|
81
|
+
message_id(props[:message_id]).
|
82
|
+
timestamp(props[:timestamp]).
|
83
|
+
type(props[:type]).
|
84
|
+
user_id(props[:user_id]).
|
85
|
+
app_id(props[:app_id]).
|
86
|
+
cluster_id(props[:cluster_id]).
|
87
|
+
build
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end # HotBunnies
|
data/lib/hot_bunnies/queue.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
java_import 'java.util.concurrent.Executors'
|
7
|
-
java_import 'java.util.concurrent.LinkedBlockingQueue'
|
8
|
-
java_import 'java.util.concurrent.ArrayBlockingQueue'
|
9
|
-
java_import 'java.util.concurrent.TimeUnit'
|
10
|
-
java_import 'java.util.concurrent.atomic.AtomicBoolean'
|
11
|
-
end
|
3
|
+
require "hot_bunnies/juc"
|
4
|
+
require "hot_bunnies/metadata"
|
5
|
+
require "hot_bunnies/consumers"
|
12
6
|
|
13
7
|
module HotBunnies
|
14
8
|
class Queue
|
@@ -18,17 +12,20 @@ module HotBunnies
|
|
18
12
|
@channel = channel
|
19
13
|
@name = name
|
20
14
|
@options = {:durable => false, :exclusive => false, :auto_delete => false, :passive => false, :arguments => Hash.new}.merge(options)
|
21
|
-
declare!
|
22
15
|
end
|
23
16
|
|
24
17
|
def bind(exchange, options={})
|
25
18
|
exchange_name = if exchange.respond_to?(:name) then exchange.name else exchange.to_s end
|
26
19
|
@channel.queue_bind(@name, exchange_name, options.fetch(:routing_key, ''), options[:arguments])
|
20
|
+
|
21
|
+
self
|
27
22
|
end
|
28
23
|
|
29
24
|
def unbind(exchange, options={})
|
30
25
|
exchange_name = if exchange.respond_to?(:name) then exchange.name else exchange.to_s end
|
31
26
|
@channel.queue_unbind(@name, exchange_name, options.fetch(:routing_key, ''))
|
27
|
+
|
28
|
+
self
|
32
29
|
end
|
33
30
|
|
34
31
|
def delete
|
@@ -39,281 +36,71 @@ module HotBunnies
|
|
39
36
|
@channel.queue_purge(@name)
|
40
37
|
end
|
41
38
|
|
42
|
-
def get(options={})
|
39
|
+
def get(options = {:block => false})
|
43
40
|
response = @channel.basic_get(@name, !options.fetch(:ack, false))
|
41
|
+
|
44
42
|
if response
|
45
|
-
|
46
|
-
else
|
43
|
+
[Headers.new(@channel, nil, response.envelope, response.props), String.from_java_bytes(response.body)]
|
44
|
+
else
|
45
|
+
nil
|
47
46
|
end
|
48
47
|
end
|
48
|
+
alias pop get
|
49
49
|
|
50
|
-
def subscribe(
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
def status
|
57
|
-
response = @channel.queue_declare_passive(@name)
|
58
|
-
[response.message_count, response.consumer_count]
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def declare!
|
64
|
-
response = if @options[:passive]
|
65
|
-
then @channel.queue_declare_passive(@name)
|
66
|
-
else @channel.queue_declare(@name, @options[:durable], @options[:exclusive], @options[:auto_delete], @options[:arguments])
|
50
|
+
def subscribe(opts = {}, &block)
|
51
|
+
consumer = if opts[:block] || opts[:blocking]
|
52
|
+
BlockingCallbackConsumer.new(@channel, opts[:buffer_size], block)
|
53
|
+
else
|
54
|
+
AsyncCallbackConsumer.new(@channel, block, opts.fetch(:executor, JavaConcurrent::Executors.new_single_thread_executor))
|
67
55
|
end
|
68
|
-
@name = response.queue
|
69
|
-
end
|
70
|
-
|
71
|
-
class Subscription
|
72
|
-
include JavaConcurrent
|
73
56
|
|
74
|
-
|
57
|
+
@consumer_tag = @channel.basic_consume(@name, !(opts[:ack] || opts[:manual_ack]), consumer)
|
58
|
+
consumer.consumer_tag = @consumer_tag
|
75
59
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
@ack = options.fetch(:ack, false)
|
60
|
+
@default_consumer = consumer
|
61
|
+
@channel.register_consumer(@consumer_tag, consumer)
|
62
|
+
consumer.start
|
80
63
|
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
def each(options={}, &block)
|
85
|
-
raise 'The subscription already has a message listener' if @consumer
|
86
|
-
start(create_consumer(options, block))
|
87
|
-
nil
|
88
|
-
end
|
89
|
-
alias_method :each_message, :each
|
90
|
-
|
91
|
-
def start(consumer)
|
92
|
-
@consumer = consumer
|
93
|
-
@consumer_tag = @channel.basic_consume(@queue_name, !@ack, @consumer)
|
94
|
-
@consumer.start
|
95
|
-
end
|
96
|
-
|
97
|
-
def cancel
|
98
|
-
raise 'Can\'t cancel: the subscriber haven\'t received an OK yet' if !self.active?
|
99
|
-
@consumer.cancel
|
100
|
-
|
101
|
-
# RabbitMQ Java client won't clear consumer_tag from cancelled consumers,
|
102
|
-
# so we have to do this. Sharing consumers
|
103
|
-
# between threads in general is a can of worms but someone somewhere
|
104
|
-
# will almost certainly do it, so. MK.
|
105
|
-
@cancelled.set(true)
|
106
|
-
|
107
|
-
maybe_shutdown_executor
|
108
|
-
end
|
109
|
-
|
110
|
-
def cancelled?
|
111
|
-
@cancelled.get
|
112
|
-
end
|
113
|
-
|
114
|
-
def active?
|
115
|
-
!@cancelled.get && !@consumer.nil? && !@consumer.consumer_tag.nil?
|
116
|
-
end
|
117
|
-
|
118
|
-
def shutdown!
|
119
|
-
if @executor && @shut_down_executor
|
120
|
-
@executor.shutdown_now
|
121
|
-
end
|
122
|
-
end
|
123
|
-
alias shut_down! shutdown!
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
def maybe_shutdown_executor
|
128
|
-
if @executor && @shut_down_executor
|
129
|
-
@executor.shutdown
|
130
|
-
unless @executor.await_termination(1, TimeUnit::SECONDS)
|
131
|
-
@executor.shutdown_now
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def create_consumer(options, callback)
|
137
|
-
if options.fetch(:blocking, true)
|
138
|
-
BlockingCallbackConsumer.new(@channel, options[:buffer_size], callback)
|
139
|
-
else
|
140
|
-
if options[:executor]
|
141
|
-
@shut_down_executor = false
|
142
|
-
@executor = options[:executor]
|
143
|
-
else
|
144
|
-
@shut_down_executor = true
|
145
|
-
@executor = Executors.new_single_thread_executor
|
146
|
-
end
|
147
|
-
AsyncCallbackConsumer.new(@channel, callback, @executor)
|
148
|
-
end
|
149
|
-
end
|
64
|
+
consumer
|
150
65
|
end
|
151
66
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
def handleDelivery(consumer_tag, envelope, properties, body)
|
156
|
-
body = String.from_java_bytes(body)
|
157
|
-
headers = Headers.new(channel, consumer_tag, envelope, properties)
|
158
|
-
deliver(headers, body)
|
159
|
-
end
|
160
|
-
|
161
|
-
def handleCancel(consumer_tag)
|
162
|
-
@cancelled = true
|
163
|
-
end
|
164
|
-
|
165
|
-
def handleCancelOk(consumer_tag)
|
166
|
-
@cancelled = true
|
167
|
-
end
|
168
|
-
|
169
|
-
def start
|
170
|
-
end
|
171
|
-
|
172
|
-
def deliver(headers, message)
|
173
|
-
raise NotImplementedError, 'To be implemented by a subclass'
|
174
|
-
end
|
175
|
-
|
176
|
-
def cancel
|
177
|
-
channel.basic_cancel(consumer_tag)
|
178
|
-
@cancelling = true
|
179
|
-
end
|
67
|
+
def status
|
68
|
+
response = @channel.queue_declare_passive(@name)
|
69
|
+
[response.message_count, response.consumer_count]
|
180
70
|
end
|
181
71
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
def initialize(channel, callback)
|
186
|
-
super(channel)
|
187
|
-
@callback = callback
|
188
|
-
@callback_arity = @callback.arity
|
189
|
-
@cancelled = false
|
190
|
-
@cancelling = false
|
191
|
-
end
|
192
|
-
|
193
|
-
def callback(headers, message)
|
194
|
-
if @callback_arity == 2
|
195
|
-
@callback.call(headers, message)
|
196
|
-
else
|
197
|
-
@callback.call(message)
|
198
|
-
end
|
199
|
-
end
|
72
|
+
def message_count
|
73
|
+
response = @channel.queue_declare_passive(@name)
|
74
|
+
response.message_count
|
200
75
|
end
|
201
76
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
@executor = executor
|
206
|
-
@tasks = []
|
207
|
-
end
|
208
|
-
|
209
|
-
def deliver(headers, message)
|
210
|
-
unless @executor.shutdown?
|
211
|
-
@executor.submit do
|
212
|
-
callback(headers, message)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
77
|
+
def consumer_count
|
78
|
+
response = @channel.queue_declare_passive(@name)
|
79
|
+
response.consumer_count
|
216
80
|
end
|
217
81
|
|
218
|
-
|
219
|
-
|
82
|
+
# Publishes a message to the queue via default exchange. Takes the same arguments
|
83
|
+
# as {Bunny::Exchange#publish}
|
84
|
+
#
|
85
|
+
# @see HotBunnies::Exchange#publish
|
86
|
+
# @see HotBunnies::Channel#default_exchange
|
87
|
+
def publish(payload, opts = {})
|
88
|
+
@channel.default_exchange.publish(payload, opts.merge(:routing_key => @name))
|
220
89
|
|
221
|
-
|
222
|
-
super(channel, callback)
|
223
|
-
if buffer_size
|
224
|
-
@internal_queue = ArrayBlockingQueue.new(buffer_size)
|
225
|
-
else
|
226
|
-
@internal_queue = LinkedBlockingQueue.new
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
def start
|
231
|
-
interrupted = false
|
232
|
-
until @cancelled || JavaConcurrent::Thread.current_thread.interrupted?
|
233
|
-
begin
|
234
|
-
pair = @internal_queue.take
|
235
|
-
callback(*pair) if pair
|
236
|
-
rescue InterruptedException => e
|
237
|
-
interrupted = true
|
238
|
-
end
|
239
|
-
end
|
240
|
-
while (pair = @internal_queue.poll)
|
241
|
-
callback(*pair)
|
242
|
-
end
|
243
|
-
if interrupted
|
244
|
-
JavaConcurrent::Thread.current_thread.interrupt
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
def deliver(*pair)
|
249
|
-
if @cancelling || @cancelled || JavaConcurrent::Thread.current_thread.interrupted?
|
250
|
-
@internal_queue.offer(pair)
|
251
|
-
else
|
252
|
-
begin
|
253
|
-
@internal_queue.put(pair)
|
254
|
-
rescue InterruptedException => e
|
255
|
-
JavaConcurrent::Thread.current_thread.interrupt
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
90
|
+
self
|
259
91
|
end
|
260
92
|
|
261
|
-
class Headers
|
262
|
-
attr_reader :channel, :consumer_tag, :envelope, :properties
|
263
|
-
|
264
|
-
def initialize(channel, consumer_tag, envelope, properties)
|
265
|
-
@channel = channel
|
266
|
-
@consumer_tag = consumer_tag
|
267
|
-
@envelope = envelope
|
268
|
-
@properties = properties
|
269
|
-
end
|
270
|
-
|
271
|
-
def ack(options={})
|
272
|
-
@channel.basic_ack(delivery_tag, options.fetch(:multiple, false))
|
273
|
-
end
|
274
|
-
|
275
|
-
def reject(options={})
|
276
|
-
@channel.basic_reject(delivery_tag, options.fetch(:requeue, false))
|
277
|
-
end
|
278
93
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
:routing_key,
|
283
|
-
:redeliver,
|
284
|
-
:exchange
|
285
|
-
].each do |envelope_property|
|
286
|
-
define_method(envelope_property) { @envelope.__send__(envelope_property) }
|
287
|
-
end
|
94
|
+
#
|
95
|
+
# Implementation
|
96
|
+
#
|
288
97
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
:content_type,
|
296
|
-
:content_encoding,
|
297
|
-
:headers,
|
298
|
-
:delivery_mode,
|
299
|
-
:priority,
|
300
|
-
:correlation_id,
|
301
|
-
:reply_to,
|
302
|
-
:expiration,
|
303
|
-
:message_id,
|
304
|
-
:timestamp,
|
305
|
-
:type,
|
306
|
-
:user_id,
|
307
|
-
:app_id,
|
308
|
-
:cluster_id
|
309
|
-
].each do |properties_property|
|
310
|
-
define_method(properties_property) { @properties.__send__(properties_property) }
|
311
|
-
end
|
312
|
-
|
313
|
-
def persistent?
|
314
|
-
persistent == 2
|
315
|
-
end
|
316
|
-
end
|
98
|
+
def declare!
|
99
|
+
response = if @options[:passive]
|
100
|
+
then @channel.queue_declare_passive(@name)
|
101
|
+
else @channel.queue_declare(@name, @options[:durable], @options[:exclusive], @options[:auto_delete], @options[:arguments])
|
102
|
+
end
|
103
|
+
@name = response.queue
|
317
104
|
end
|
318
|
-
end
|
319
|
-
end
|
105
|
+
end # Queue
|
106
|
+
end # HotBunnies
|
@@ -0,0 +1,170 @@
|
|
1
|
+
module HotBunnies
|
2
|
+
java_import com.rabbitmq.client.ConnectionFactory
|
3
|
+
java_import com.rabbitmq.client.Connection
|
4
|
+
java_import java.util.concurrent.ConcurrentHashMap
|
5
|
+
|
6
|
+
class Session
|
7
|
+
|
8
|
+
#
|
9
|
+
# API
|
10
|
+
#
|
11
|
+
|
12
|
+
def self.connect(options={})
|
13
|
+
cf = ConnectionFactory.new
|
14
|
+
|
15
|
+
cf.uri = options[:uri] if options[:uri]
|
16
|
+
cf.host = hostname_from(options) if include_host?(options)
|
17
|
+
cf.port = options[:port] if options[:port]
|
18
|
+
cf.virtual_host = vhost_from(options) if include_vhost?(options)
|
19
|
+
cf.connection_timeout = timeout_from(options) if include_timeout?(options)
|
20
|
+
cf.username = username_from(options) if include_username?(options)
|
21
|
+
cf.password = password_from(options) if include_password?(options)
|
22
|
+
|
23
|
+
cf.requested_heartbeat = heartbeat_from(options) if include_heartbeat?(options)
|
24
|
+
cf.connection_timeout = connection_timeout_from(options) if include_connection_timeout?(options)
|
25
|
+
|
26
|
+
tls = (options[:ssl] || options[:tls])
|
27
|
+
case tls
|
28
|
+
when true then
|
29
|
+
cf.use_ssl_protocol
|
30
|
+
when String then
|
31
|
+
if options[:trust_manager]
|
32
|
+
cf.use_ssl_protocol(tls, options[:trust_manager])
|
33
|
+
else
|
34
|
+
cf.use_ssl_protocol(tls)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
new(cf)
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def initialize(connection_factory)
|
43
|
+
@cf = connection_factory
|
44
|
+
@connection = self.new_connection
|
45
|
+
@channels = ConcurrentHashMap.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def create_channel(n = nil)
|
49
|
+
jc = if n
|
50
|
+
@connection.create_channel(n)
|
51
|
+
else
|
52
|
+
@connection.create_channel
|
53
|
+
end
|
54
|
+
|
55
|
+
ch = Channel.new(self, jc)
|
56
|
+
register_channel(ch)
|
57
|
+
|
58
|
+
ch
|
59
|
+
end
|
60
|
+
|
61
|
+
def close
|
62
|
+
@channels.select { |_, ch| ch.open? }.each do |_, ch|
|
63
|
+
ch.close
|
64
|
+
end
|
65
|
+
|
66
|
+
@connection.close
|
67
|
+
end
|
68
|
+
|
69
|
+
def flush
|
70
|
+
@connection.flush
|
71
|
+
end
|
72
|
+
|
73
|
+
def heartbeat=(n)
|
74
|
+
@connection.heartbeat = n
|
75
|
+
end
|
76
|
+
|
77
|
+
def method_missing(selector, *args)
|
78
|
+
@connection.__send__(selector, *args)
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
#
|
83
|
+
# Implementation
|
84
|
+
#
|
85
|
+
|
86
|
+
def register_channel(ch)
|
87
|
+
@channels[ch.channel_number] = ch
|
88
|
+
end
|
89
|
+
|
90
|
+
def unregister_channel(ch)
|
91
|
+
@channels.delete(ch.channel_number)
|
92
|
+
end
|
93
|
+
|
94
|
+
protected
|
95
|
+
|
96
|
+
def self.hostname_from(options)
|
97
|
+
options[:host] || options[:hostname] || ConnectionFactory.DEFAULT_HOST
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.include_host?(options)
|
101
|
+
!!(options[:host] || options[:hostname])
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.vhost_from(options)
|
105
|
+
options[:virtual_host] || options[:vhost] || ConnectionFactory.DEFAULT_VHOST
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.include_vhost?(options)
|
109
|
+
!!(options[:virtual_host] || options[:vhost])
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.timeout_from(options)
|
113
|
+
options[:connection_timeout] || options[:timeout]
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.include_timeout?(options)
|
117
|
+
!!(options[:connection_timeout] || options[:timeout])
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.username_from(options)
|
121
|
+
options[:username] || options[:user] || ConnectionFactory.DEFAULT_USER
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.heartbeat_from(options)
|
125
|
+
options[:heartbeat_interval] || options[:requested_heartbeat] || ConnectionFactory.DEFAULT_HEARTBEAT
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.connection_timeout_from(options)
|
129
|
+
options[:connection_timeout_interval] || options[:connection_timeout] || ConnectionFactory.DEFAULT_CONNECTION_TIMEOUT
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.include_username?(options)
|
133
|
+
!!(options[:username] || options[:user])
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.password_from(options)
|
137
|
+
options[:password] || options[:pass] || ConnectionFactory.DEFAULT_PASS
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.include_password?(options)
|
141
|
+
!!(options[:password] || options[:pass])
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.include_heartbeat?(options)
|
145
|
+
!!(options[:heartbeat_interval] || options[:requested_heartbeat] || options[:heartbeat])
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.include_connection_timeout?(options)
|
149
|
+
!!(options[:connection_timeout_interval] || options[:connection_timeout])
|
150
|
+
end
|
151
|
+
|
152
|
+
# Executes a block, catching Java exceptions RabbitMQ Java client throws and
|
153
|
+
# transforms them to Ruby exceptions that are then re-raised.
|
154
|
+
#
|
155
|
+
# @private
|
156
|
+
def converting_rjc_exceptions_to_ruby(&block)
|
157
|
+
begin
|
158
|
+
block.call
|
159
|
+
rescue com.rabbitmq.client.PossibleAuthenticationFailureException => e
|
160
|
+
raise PossibleAuthenticationFailureError.new(@cf.username, @cf.virtual_host, @cf.password.bytesize)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def new_connection
|
165
|
+
converting_rjc_exceptions_to_ruby do
|
166
|
+
@cf.new_connection
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
data/lib/hot_bunnies/version.rb
CHANGED