amq-client 0.7.0.alpha35 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +0 -1
- data/.travis.yml +9 -3
- data/Gemfile +22 -12
- data/amq-client.gemspec +1 -1
- data/examples/coolio_adapter/example_helper.rb +2 -0
- data/examples/eventmachine_adapter/basic_consume_with_acknowledgements.rb +3 -3
- data/examples/eventmachine_adapter/{connection_failure_callback.rb → error_handling/connection_failure_callback.rb} +4 -8
- data/examples/eventmachine_adapter/{connection_failure_exception.rb → error_handling/connection_failure_exception.rb} +5 -9
- data/examples/eventmachine_adapter/{connection_loss_handler.rb → error_handling/connection_loss_handler_that_fails_over.rb} +12 -12
- data/examples/eventmachine_adapter/error_handling/connection_loss_handler_with_automatic_recovery.rb +85 -0
- data/examples/eventmachine_adapter/error_handling/connection_loss_handler_with_manual_recovery.rb +85 -0
- data/examples/eventmachine_adapter/error_handling/handling_a_channel_level_exception.rb +2 -5
- data/examples/eventmachine_adapter/example_helper.rb +2 -0
- data/examples/eventmachine_adapter/server_capabilities.rb +12 -0
- data/examples/eventmachine_adapter/tls/tls_without_peer_verification.rb +2 -2
- data/lib/amq/client/async/adapter.rb +170 -31
- data/lib/amq/client/async/adapters/coolio.rb +18 -1
- data/lib/amq/client/async/adapters/event_machine.rb +48 -32
- data/lib/amq/client/async/adapters/eventmachine.rb +3 -1
- data/lib/amq/client/async/callbacks.rb +9 -7
- data/lib/amq/client/async/channel.rb +113 -20
- data/lib/amq/client/async/consumer.rb +270 -0
- data/lib/amq/client/async/exchange.rb +137 -16
- data/lib/amq/client/async/extensions/rabbitmq/confirm.rb +4 -4
- data/lib/amq/client/async/queue.rb +217 -113
- data/lib/amq/client/callbacks.rb +2 -0
- data/lib/amq/client/consumer_tag_generator.rb +24 -0
- data/lib/amq/client/exceptions.rb +10 -6
- data/lib/amq/client/handlers_registry.rb +2 -0
- data/lib/amq/client/queue.rb +2 -0
- data/lib/amq/client/server_named_entity.rb +1 -8
- data/lib/amq/client/settings.rb +64 -2
- data/lib/amq/client/version.rb +3 -1
- data/spec/benchmarks/adapters.rb +2 -0
- data/spec/client/framing/io_frame_spec.rb +9 -6
- data/spec/integration/coolio/basic_ack_spec.rb +2 -0
- data/spec/integration/coolio/basic_cancel_spec.rb +2 -0
- data/spec/integration/coolio/basic_consume_spec.rb +58 -0
- data/spec/integration/coolio/basic_get_spec.rb +2 -0
- data/spec/integration/coolio/basic_return_spec.rb +2 -0
- data/spec/integration/coolio/channel_close_spec.rb +2 -0
- data/spec/integration/coolio/channel_flow_spec.rb +2 -0
- data/spec/integration/coolio/connection_close_spec.rb +2 -0
- data/spec/integration/coolio/connection_start_spec.rb +2 -0
- data/spec/integration/coolio/exchange_declare_spec.rb +8 -6
- data/spec/integration/coolio/spec_helper.rb +2 -0
- data/spec/integration/coolio/tx_commit_spec.rb +2 -1
- data/spec/integration/coolio/tx_rollback_spec.rb +1 -1
- data/spec/integration/eventmachine/basic_ack_spec.rb +3 -1
- data/spec/integration/eventmachine/basic_cancel_spec.rb +2 -0
- data/spec/integration/eventmachine/basic_consume_spec.rb +90 -6
- data/spec/integration/eventmachine/basic_get_spec.rb +2 -0
- data/spec/integration/eventmachine/basic_return_spec.rb +2 -0
- data/spec/integration/eventmachine/channel_close_spec.rb +2 -0
- data/spec/integration/eventmachine/channel_flow_spec.rb +4 -2
- data/spec/integration/eventmachine/concurrent_basic_publish_spec.rb +79 -0
- data/spec/integration/eventmachine/connection_close_spec.rb +2 -0
- data/spec/integration/eventmachine/connection_start_spec.rb +2 -0
- data/spec/integration/eventmachine/exchange_declare_spec.rb +4 -2
- data/spec/integration/eventmachine/queue_declare_spec.rb +2 -0
- data/spec/integration/eventmachine/regressions/amqp_gem_issue66_spec.rb +2 -0
- data/spec/integration/eventmachine/spec_helper.rb +2 -0
- data/spec/integration/eventmachine/tx_commit_spec.rb +2 -1
- data/spec/integration/eventmachine/tx_rollback_spec.rb +1 -1
- data/spec/regression/bad_frame_slicing_in_adapters_spec.rb +2 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/client/settings_spec.rb +92 -3
- metadata +24 -23
- data/CONTRIBUTORS +0 -3
@@ -100,7 +100,7 @@ module AMQ
|
|
100
100
|
# AMQ protocol defines two-step process of closing connection (send Connection.Close
|
101
101
|
# to the peer and wait for Connection.Close-Ok), implemented by {Adapter#disconnect}
|
102
102
|
def close_connection
|
103
|
-
raise
|
103
|
+
raise NotImplementedError
|
104
104
|
end unless defined?(:close_connection) # since it is a module, this method may already be defined
|
105
105
|
end
|
106
106
|
end # self.included(host)
|
@@ -196,11 +196,12 @@ module AMQ
|
|
196
196
|
#
|
197
197
|
|
198
198
|
|
199
|
+
|
199
200
|
# Establish socket connection to the server.
|
200
201
|
#
|
201
202
|
# @api plugin
|
202
203
|
def establish_connection(settings)
|
203
|
-
raise
|
204
|
+
raise NotImplementedError
|
204
205
|
end
|
205
206
|
|
206
207
|
# Properly close connection with AMQ broker, as described in
|
@@ -224,6 +225,8 @@ module AMQ
|
|
224
225
|
end
|
225
226
|
|
226
227
|
|
228
|
+
|
229
|
+
|
227
230
|
# Sends AMQ protocol header (also known as preamble).
|
228
231
|
#
|
229
232
|
# @note This must be implemented by all AMQP clients.
|
@@ -244,11 +247,19 @@ module AMQ
|
|
244
247
|
end
|
245
248
|
end
|
246
249
|
|
247
|
-
# Sends multiple frames, one by one.
|
250
|
+
# Sends multiple frames, one by one. For thread safety this method takes a channel
|
251
|
+
# object and synchronizes on it.
|
248
252
|
#
|
249
253
|
# @api public
|
250
|
-
def send_frameset(frames)
|
251
|
-
|
254
|
+
def send_frameset(frames, channel)
|
255
|
+
# some (many) developers end up sharing channels between threads and when multiple
|
256
|
+
# threads publish on the same channel aggressively, at some point frames will be
|
257
|
+
# delivered out of order and broker will raise 505 UNEXPECTED_FRAME exception.
|
258
|
+
# If we synchronize on the channel, however, this is both thread safe and pretty fine-grained
|
259
|
+
# locking. Note that "single frame" methods do not need this kind of synchronization. MK.
|
260
|
+
channel.synchronize do
|
261
|
+
frames.each { |frame| self.send_frame(frame) }
|
262
|
+
end
|
252
263
|
end # send_frameset(frames)
|
253
264
|
|
254
265
|
|
@@ -274,18 +285,166 @@ module AMQ
|
|
274
285
|
end # vhost
|
275
286
|
|
276
287
|
|
288
|
+
|
289
|
+
# @group Error Handling and Recovery
|
290
|
+
|
291
|
+
# Called when initial TCP connection fails.
|
292
|
+
# @api public
|
293
|
+
def tcp_connection_failed
|
294
|
+
@recovered = false
|
295
|
+
|
296
|
+
@on_tcp_connection_failure.call(@settings) if @on_tcp_connection_failure
|
297
|
+
end
|
298
|
+
|
277
299
|
# Called when previously established TCP connection fails.
|
278
300
|
# @api public
|
279
301
|
def tcp_connection_lost
|
302
|
+
@recovered = false
|
303
|
+
|
280
304
|
@on_tcp_connection_loss.call(self, @settings) if @on_tcp_connection_loss
|
305
|
+
self.handle_connection_interruption
|
281
306
|
end
|
282
307
|
|
283
|
-
#
|
308
|
+
# @return [Boolean]
|
309
|
+
def reconnecting?
|
310
|
+
@reconnecting
|
311
|
+
end # reconnecting?
|
312
|
+
|
313
|
+
|
314
|
+
# Defines a callback that will be run when initial TCP connection fails.
|
315
|
+
# You can define only one callback.
|
316
|
+
#
|
284
317
|
# @api public
|
285
|
-
def
|
286
|
-
@on_tcp_connection_failure
|
318
|
+
def on_tcp_connection_failure(&block)
|
319
|
+
@on_tcp_connection_failure = block
|
287
320
|
end
|
288
321
|
|
322
|
+
# Defines a callback that will be run when TCP connection to AMQP broker is lost (interrupted).
|
323
|
+
# You can define only one callback.
|
324
|
+
#
|
325
|
+
# @api public
|
326
|
+
def on_tcp_connection_loss(&block)
|
327
|
+
@on_tcp_connection_loss = block
|
328
|
+
end
|
329
|
+
|
330
|
+
# Defines a callback that will be run when TCP connection is closed before authentication
|
331
|
+
# finishes. Usually this means authentication failure. You can define only one callback.
|
332
|
+
#
|
333
|
+
# @api public
|
334
|
+
def on_possible_authentication_failure(&block)
|
335
|
+
@on_possible_authentication_failure = block
|
336
|
+
end
|
337
|
+
|
338
|
+
|
339
|
+
# Defines a callback that will be executed when connection is closed after
|
340
|
+
# connection-level exception. Only one callback can be defined (the one defined last
|
341
|
+
# replaces previously added ones).
|
342
|
+
#
|
343
|
+
# @api public
|
344
|
+
def on_error(&block)
|
345
|
+
self.redefine_callback(:error, &block)
|
346
|
+
end
|
347
|
+
|
348
|
+
|
349
|
+
# Defines a callback that will be executed after TCP connection is interrupted (typically because of a network failure).
|
350
|
+
# Only one callback can be defined (the one defined last replaces previously added ones).
|
351
|
+
#
|
352
|
+
# @api public
|
353
|
+
def on_connection_interruption(&block)
|
354
|
+
self.redefine_callback(:after_connection_interruption, &block)
|
355
|
+
end # on_connection_interruption(&block)
|
356
|
+
alias after_connection_interruption on_connection_interruption
|
357
|
+
|
358
|
+
|
359
|
+
# @private
|
360
|
+
# @api plugin
|
361
|
+
def handle_connection_interruption
|
362
|
+
@channels.each { |n, c| c.handle_connection_interruption }
|
363
|
+
self.exec_callback_yielding_self(:after_connection_interruption)
|
364
|
+
end # handle_connection_interruption
|
365
|
+
|
366
|
+
|
367
|
+
|
368
|
+
# Defines a callback that will be executed after TCP connection has recovered after a network failure
|
369
|
+
# but before AMQP connection is re-opened.
|
370
|
+
# Only one callback can be defined (the one defined last replaces previously added ones).
|
371
|
+
#
|
372
|
+
# @api public
|
373
|
+
def before_recovery(&block)
|
374
|
+
self.redefine_callback(:before_recovery, &block)
|
375
|
+
end # before_recovery(&block)
|
376
|
+
|
377
|
+
# @private
|
378
|
+
def run_before_recovery_callbacks
|
379
|
+
self.exec_callback_yielding_self(:before_recovery, @settings)
|
380
|
+
|
381
|
+
@channels.each { |n, ch| ch.run_before_recovery_callbacks }
|
382
|
+
end
|
383
|
+
|
384
|
+
|
385
|
+
# Defines a callback that will be executed after AMQP connection has recovered after a network failure..
|
386
|
+
# Only one callback can be defined (the one defined last replaces previously added ones).
|
387
|
+
#
|
388
|
+
# @api public
|
389
|
+
def on_recovery(&block)
|
390
|
+
self.redefine_callback(:after_recovery, &block)
|
391
|
+
end # on_recovery(&block)
|
392
|
+
alias after_recovery on_recovery
|
393
|
+
|
394
|
+
# @private
|
395
|
+
def run_after_recovery_callbacks
|
396
|
+
self.exec_callback_yielding_self(:after_recovery, @settings)
|
397
|
+
|
398
|
+
@channels.each { |n, ch| ch.run_after_recovery_callbacks }
|
399
|
+
end
|
400
|
+
|
401
|
+
|
402
|
+
# @return [Boolean] whether connection is in the automatic recovery mode
|
403
|
+
# @api public
|
404
|
+
def auto_recovering?
|
405
|
+
!!@auto_recovery
|
406
|
+
end # auto_recovering?
|
407
|
+
alias auto_recovery? auto_recovering?
|
408
|
+
|
409
|
+
|
410
|
+
# Performs recovery of channels that are in the automatic recovery mode. Does not run recovery
|
411
|
+
# callbacks.
|
412
|
+
#
|
413
|
+
# @see Channel#auto_recover
|
414
|
+
# @see Queue#auto_recover
|
415
|
+
# @see Exchange#auto_recover
|
416
|
+
# @api plugin
|
417
|
+
def auto_recover
|
418
|
+
@channels.select { |channel_id, ch| ch.auto_recovering? }.each { |n, ch| ch.auto_recover }
|
419
|
+
end # auto_recover
|
420
|
+
|
421
|
+
|
422
|
+
# Performs recovery of channels that are in the automatic recovery mode. "before recovery" callbacks
|
423
|
+
# are run immediately, "after recovery" callbacks are run after AMQP connection is re-established and
|
424
|
+
# auto recovery is performed (using #auto_recover).
|
425
|
+
#
|
426
|
+
# Use this method if you want to run automatic recovery process after handling a connection-level exception,
|
427
|
+
# for example, 320 CONNECTION_FORCED (used by RabbitMQ when it is shut down gracefully).
|
428
|
+
#
|
429
|
+
# @see Channel#auto_recover
|
430
|
+
# @see Queue#auto_recover
|
431
|
+
# @see Exchange#auto_recover
|
432
|
+
# @api plugin
|
433
|
+
def start_automatic_recovery
|
434
|
+
self.run_before_recovery_callbacks
|
435
|
+
self.register_connection_callback do
|
436
|
+
# always run automatic recovery, because it is per-channel
|
437
|
+
# and connection has to start it. Channels that did not opt-in for
|
438
|
+
# autorecovery won't be selected. MK.
|
439
|
+
self.auto_recover
|
440
|
+
self.run_after_recovery_callbacks
|
441
|
+
end
|
442
|
+
end # start_automatic_recovery
|
443
|
+
|
444
|
+
|
445
|
+
# @endgroup
|
446
|
+
|
447
|
+
|
289
448
|
|
290
449
|
|
291
450
|
#
|
@@ -298,7 +457,7 @@ module AMQ
|
|
298
457
|
# @note This must be implemented by all AMQP clients.
|
299
458
|
# @api plugin
|
300
459
|
def send_raw(data)
|
301
|
-
raise
|
460
|
+
raise NotImplementedError
|
302
461
|
end
|
303
462
|
|
304
463
|
# Sends connection preamble to the broker.
|
@@ -358,7 +517,8 @@ module AMQ
|
|
358
517
|
@last_server_heartbeat = Time.now
|
359
518
|
else
|
360
519
|
if callable = AMQ::Client::HandlersRegistry.find(frame.method_class)
|
361
|
-
|
520
|
+
f = frames.shift
|
521
|
+
callable.call(self, f, frames)
|
362
522
|
else
|
363
523
|
raise MissingHandlerError.new(frames.first)
|
364
524
|
end
|
@@ -380,20 +540,6 @@ module AMQ
|
|
380
540
|
|
381
541
|
|
382
542
|
|
383
|
-
# @group Error handling
|
384
|
-
|
385
|
-
# Defines a callback that will be executed when channel is closed after
|
386
|
-
# channel-level exception. Only one callback can be defined (the one defined last
|
387
|
-
# replaces previously added ones).
|
388
|
-
#
|
389
|
-
# @api public
|
390
|
-
def on_error(&block)
|
391
|
-
self.redefine_callback(:error, &block)
|
392
|
-
end
|
393
|
-
|
394
|
-
# @endgroup
|
395
|
-
|
396
|
-
|
397
543
|
|
398
544
|
|
399
545
|
# Handles connection.start.
|
@@ -449,8 +595,6 @@ module AMQ
|
|
449
595
|
# @api plugin
|
450
596
|
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.5.2.9)
|
451
597
|
def handle_close(conn_close)
|
452
|
-
self.handle_connection_interruption
|
453
|
-
|
454
598
|
closed!
|
455
599
|
# TODO: use proper exception class, provide protocol class (we know conn_close.class_id and conn_close.method_id) as well!
|
456
600
|
self.exec_callback_yielding_self(:error, conn_close)
|
@@ -466,11 +610,6 @@ module AMQ
|
|
466
610
|
self.disconnection_successful
|
467
611
|
end # handle_close_ok(close_ok)
|
468
612
|
|
469
|
-
# @api plugin
|
470
|
-
def handle_connection_interruption
|
471
|
-
@channels.each { |n, c| c.handle_connection_interruption }
|
472
|
-
end # handle_connection_interruption
|
473
|
-
|
474
613
|
|
475
614
|
|
476
615
|
protected
|
@@ -122,6 +122,8 @@ module AMQ
|
|
122
122
|
@locale = @settings.fetch(:locale, "en_GB")
|
123
123
|
@client_properties = Settings.client_properties.merge(@settings.fetch(:client_properties, Hash.new))
|
124
124
|
|
125
|
+
@auto_recovery = (!!@settings[:auto_recovery])
|
126
|
+
|
125
127
|
socket
|
126
128
|
end
|
127
129
|
|
@@ -276,6 +278,21 @@ module AMQ
|
|
276
278
|
|
277
279
|
# @api private
|
278
280
|
def post_init
|
281
|
+
if @had_successfully_connected_before
|
282
|
+
@recovered = true
|
283
|
+
|
284
|
+
self.exec_callback_yielding_self(:before_recovery, @settings)
|
285
|
+
|
286
|
+
self.register_connection_callback do
|
287
|
+
self.auto_recover
|
288
|
+
self.exec_callback_yielding_self(:after_recovery, @settings)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# now we can set it. MK.
|
293
|
+
@had_successfully_connected_before = true
|
294
|
+
@reconnecting = false
|
295
|
+
|
279
296
|
self.reset
|
280
297
|
self.handshake
|
281
298
|
end
|
@@ -285,7 +302,7 @@ module AMQ
|
|
285
302
|
@chunk_buffer = ""
|
286
303
|
@frames = Array.new
|
287
304
|
end
|
288
|
-
end # CoolioClient
|
305
|
+
end # CoolioClient
|
289
306
|
end # Async
|
290
307
|
end # Client
|
291
308
|
end # AMQ
|
@@ -21,6 +21,8 @@ module AMQ
|
|
21
21
|
# API
|
22
22
|
#
|
23
23
|
|
24
|
+
# @group Connection operations
|
25
|
+
|
24
26
|
# Initiates connection to AMQP broker. If callback is given, runs it when (and if) AMQP connection
|
25
27
|
# succeeds.
|
26
28
|
#
|
@@ -60,15 +62,42 @@ module AMQ
|
|
60
62
|
|
61
63
|
if !@reconnecting
|
62
64
|
@reconnecting = true
|
65
|
+
self.reset
|
66
|
+
end
|
67
|
+
|
68
|
+
EventMachine.reconnect(@settings[:host], @settings[:port], self)
|
69
|
+
end
|
63
70
|
|
64
|
-
|
71
|
+
# Similar to #reconnect, but uses different connection settings
|
72
|
+
# @see #reconnect
|
73
|
+
# @api public
|
74
|
+
def reconnect_to(settings, period = 5)
|
75
|
+
if !@reconnecting
|
76
|
+
@reconnecting = true
|
65
77
|
self.reset
|
66
78
|
end
|
67
79
|
|
80
|
+
@settings = Settings.configure(settings)
|
68
81
|
EventMachine.reconnect(@settings[:host], @settings[:port], self)
|
69
82
|
end
|
70
83
|
|
71
84
|
|
85
|
+
# Periodically try to reconnect.
|
86
|
+
#
|
87
|
+
# @param [Fixnum] period Period of time, in seconds, to wait before reconnection attempt.
|
88
|
+
# @param [Boolean] force If true, enforces immediate reconnection.
|
89
|
+
# @api public
|
90
|
+
def periodically_reconnect(period = 5)
|
91
|
+
@reconnecting = true
|
92
|
+
self.reset
|
93
|
+
|
94
|
+
@periodic_reconnection_timer = EventMachine::PeriodicTimer.new(period) {
|
95
|
+
EventMachine.reconnect(@settings[:host], @settings[:port], self)
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
# @endgroup
|
100
|
+
|
72
101
|
|
73
102
|
|
74
103
|
|
@@ -92,30 +121,6 @@ module AMQ
|
|
92
121
|
end # on_closed(&block)
|
93
122
|
alias on_disconnection on_closed
|
94
123
|
|
95
|
-
# Defines a callback that will be run when initial TCP connection fails.
|
96
|
-
# You can define only one callback.
|
97
|
-
#
|
98
|
-
# @api public
|
99
|
-
def on_tcp_connection_failure(&block)
|
100
|
-
@on_tcp_connection_failure = block
|
101
|
-
end
|
102
|
-
|
103
|
-
# Defines a callback that will be run when TCP connection to AMQP broker is lost (interrupted).
|
104
|
-
# You can define only one callback.
|
105
|
-
#
|
106
|
-
# @api public
|
107
|
-
def on_tcp_connection_loss(&block)
|
108
|
-
@on_tcp_connection_loss = block
|
109
|
-
end
|
110
|
-
|
111
|
-
# Defines a callback that will be run when TCP connection is closed before authentication
|
112
|
-
# finishes. Usually this means authentication failure. You can define only one callback.
|
113
|
-
#
|
114
|
-
# @api public
|
115
|
-
def on_possible_authentication_failure(&block)
|
116
|
-
@on_possible_authentication_failure = block
|
117
|
-
end
|
118
|
-
|
119
124
|
# @see #on_open
|
120
125
|
# @private
|
121
126
|
def register_connection_callback(&block)
|
@@ -162,6 +167,8 @@ module AMQ
|
|
162
167
|
@locale = @settings.fetch(:locale, "en_GB")
|
163
168
|
@client_properties = Settings.client_properties.merge(@settings.fetch(:client_properties, Hash.new))
|
164
169
|
|
170
|
+
@auto_recovery = (!!@settings[:auto_recovery])
|
171
|
+
|
165
172
|
self.reset
|
166
173
|
self.set_pending_connect_timeout((@settings[:timeout] || 3).to_f) unless defined?(JRUBY_VERSION)
|
167
174
|
|
@@ -203,8 +210,6 @@ module AMQ
|
|
203
210
|
|
204
211
|
|
205
212
|
|
206
|
-
|
207
|
-
|
208
213
|
#
|
209
214
|
# Implementation
|
210
215
|
#
|
@@ -243,11 +248,22 @@ module AMQ
|
|
243
248
|
# software that calls #post_init before #unbind even when TCP connection
|
244
249
|
# fails. MK.
|
245
250
|
@tcp_connection_established = true
|
251
|
+
@periodic_reconnection_timer.cancel if @periodic_reconnection_timer
|
252
|
+
|
253
|
+
|
246
254
|
# again, this is because #unbind is called in different situations
|
247
255
|
# and there is no easy way to tell initial connection failure
|
248
256
|
# from connection loss. Not in EventMachine 0.12.x, anyway. MK.
|
249
|
-
@had_successfull_connected_before = true
|
250
257
|
|
258
|
+
if @had_successfully_connected_before
|
259
|
+
@recovered = true
|
260
|
+
|
261
|
+
|
262
|
+
self.start_automatic_recovery
|
263
|
+
end
|
264
|
+
|
265
|
+
# now we can set it. MK.
|
266
|
+
@had_successfully_connected_before = true
|
251
267
|
@reconnecting = false
|
252
268
|
|
253
269
|
self.handshake
|
@@ -268,7 +284,7 @@ module AMQ
|
|
268
284
|
# * Initial TCP connection fails
|
269
285
|
# @private
|
270
286
|
def unbind(exception = nil)
|
271
|
-
if !@tcp_connection_established && !@
|
287
|
+
if !@tcp_connection_established && !@had_successfully_connected_before && !@intentionally_closing_connection
|
272
288
|
@tcp_connection_failed = true
|
273
289
|
self.tcp_connection_failed
|
274
290
|
end
|
@@ -276,13 +292,13 @@ module AMQ
|
|
276
292
|
closing!
|
277
293
|
@tcp_connection_established = false
|
278
294
|
|
279
|
-
self.handle_connection_interruption
|
295
|
+
self.handle_connection_interruption if @reconnecting
|
280
296
|
@disconnection_deferrable.succeed
|
281
297
|
|
282
298
|
closed!
|
283
299
|
|
284
300
|
|
285
|
-
self.tcp_connection_lost if !@intentionally_closing_connection && @
|
301
|
+
self.tcp_connection_lost if !@intentionally_closing_connection && @had_successfully_connected_before
|
286
302
|
|
287
303
|
# since AMQP spec dictates that authentication failure is a protocol exception
|
288
304
|
# and protocol exceptions result in connection closure, check whether we are
|
@@ -386,7 +402,7 @@ module AMQ
|
|
386
402
|
start_tls
|
387
403
|
end
|
388
404
|
end # upgrade_to_tls_if_necessary
|
389
|
-
end # EventMachineClient
|
405
|
+
end # EventMachineClient
|
390
406
|
end # Async
|
391
407
|
end # Client
|
392
408
|
end # AMQ
|