bunny 2.14.4 → 2.19.0

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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -12
  3. data/lib/bunny/channel.rb +2 -2
  4. data/lib/bunny/queue.rb +0 -3
  5. data/lib/bunny/reader_loop.rb +11 -11
  6. data/lib/bunny/session.rb +42 -9
  7. data/lib/bunny/transport.rb +12 -11
  8. data/lib/bunny/version.rb +1 -1
  9. data/spec/higher_level_api/integration/basic_cancel_spec.rb +4 -4
  10. data/spec/higher_level_api/integration/basic_consume_spec.rb +17 -9
  11. data/spec/higher_level_api/integration/connection_spec.rb +26 -0
  12. data/spec/higher_level_api/integration/tls_connection_spec.rb +194 -189
  13. data/spec/issues/issue202_spec.rb +1 -1
  14. data/spec/issues/issue609_spec.rb +84 -0
  15. data/spec/issues/issue78_spec.rb +2 -2
  16. data/spec/lower_level_api/integration/basic_cancel_spec.rb +1 -1
  17. data/spec/lower_level_api/integration/basic_consume_spec.rb +8 -8
  18. data/spec/unit/exchange_recovery_spec.rb +2 -2
  19. metadata +37 -95
  20. data/.github/ISSUE_TEMPLATE.md +0 -18
  21. data/.gitignore +0 -28
  22. data/.rspec +0 -1
  23. data/.travis.yml +0 -32
  24. data/.yardopts +0 -8
  25. data/CONTRIBUTING.md +0 -132
  26. data/ChangeLog.md +0 -2103
  27. data/Gemfile +0 -55
  28. data/LICENSE +0 -21
  29. data/Rakefile +0 -54
  30. data/benchmarks/basic_publish/with_128K_messages.rb +0 -35
  31. data/benchmarks/basic_publish/with_1k_messages.rb +0 -35
  32. data/benchmarks/basic_publish/with_4K_messages.rb +0 -35
  33. data/benchmarks/basic_publish/with_64K_messages.rb +0 -35
  34. data/benchmarks/channel_open.rb +0 -28
  35. data/benchmarks/mutex_and_monitor.rb +0 -42
  36. data/benchmarks/queue_declare.rb +0 -29
  37. data/benchmarks/queue_declare_and_bind.rb +0 -29
  38. data/benchmarks/queue_declare_bind_and_delete.rb +0 -29
  39. data/benchmarks/synchronized_sorted_set.rb +0 -53
  40. data/benchmarks/write_vs_write_nonblock.rb +0 -49
  41. data/bunny.gemspec +0 -34
  42. data/docker-compose.yml +0 -28
  43. data/docker/Dockerfile +0 -24
  44. data/docker/apt/preferences.d/erlang +0 -3
  45. data/docker/apt/sources.list.d/bintray.rabbitmq.list +0 -2
  46. data/docker/docker-entrypoint.sh +0 -26
  47. data/docker/rabbitmq.conf +0 -29
  48. data/examples/connection/authentication_failure.rb +0 -16
  49. data/examples/connection/automatic_recovery_with_basic_get.rb +0 -40
  50. data/examples/connection/automatic_recovery_with_client_named_queues.rb +0 -36
  51. data/examples/connection/automatic_recovery_with_multiple_consumers.rb +0 -46
  52. data/examples/connection/automatic_recovery_with_republishing.rb +0 -109
  53. data/examples/connection/automatic_recovery_with_server_named_queues.rb +0 -35
  54. data/examples/connection/channel_level_exception.rb +0 -27
  55. data/examples/connection/disabled_automatic_recovery.rb +0 -34
  56. data/examples/connection/heartbeat.rb +0 -17
  57. data/examples/connection/manually_reconnecting_consumer.rb +0 -23
  58. data/examples/connection/manually_reconnecting_publisher.rb +0 -28
  59. data/examples/connection/unknown_host.rb +0 -16
  60. data/examples/consumers/high_and_low_priority.rb +0 -50
  61. data/examples/guides/exchanges/direct_exchange_routing.rb +0 -36
  62. data/examples/guides/exchanges/fanout_exchange_routing.rb +0 -28
  63. data/examples/guides/exchanges/headers_exchange_routing.rb +0 -31
  64. data/examples/guides/exchanges/mandatory_messages.rb +0 -30
  65. data/examples/guides/extensions/alternate_exchange.rb +0 -30
  66. data/examples/guides/extensions/basic_nack.rb +0 -33
  67. data/examples/guides/extensions/connection_blocked.rb +0 -35
  68. data/examples/guides/extensions/consumer_cancellation_notification.rb +0 -39
  69. data/examples/guides/extensions/dead_letter_exchange.rb +0 -32
  70. data/examples/guides/extensions/exchange_to_exchange_bindings.rb +0 -29
  71. data/examples/guides/extensions/per_message_ttl.rb +0 -36
  72. data/examples/guides/extensions/per_queue_message_ttl.rb +0 -36
  73. data/examples/guides/extensions/publisher_confirms.rb +0 -28
  74. data/examples/guides/extensions/queue_lease.rb +0 -26
  75. data/examples/guides/extensions/sender_selected_distribution.rb +0 -32
  76. data/examples/guides/getting_started/blabbr.rb +0 -27
  77. data/examples/guides/getting_started/hello_world.rb +0 -22
  78. data/examples/guides/getting_started/weathr.rb +0 -49
  79. data/examples/guides/queues/one_off_consumer.rb +0 -25
  80. data/examples/guides/queues/redeliveries.rb +0 -81
  81. data/profiling/basic_publish/with_4K_messages.rb +0 -33
  82. data/repl +0 -3
  83. data/spec/tls/generate-server-cert.sh +0 -8
  84. data/spec/tls/server-openssl.cnf +0 -10
  85. data/spec/tls/server.csr +0 -16
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require "rubygems"
5
- require "set"
6
- require "thread"
7
- require "benchmark"
8
-
9
- require "bunny/concurrent/synchronized_sorted_set"
10
-
11
- puts
12
- puts "-" * 80
13
- puts "Benchmarking on #{RUBY_DESCRIPTION}"
14
-
15
- n = 2_000_000
16
- s = SortedSet.new
17
-
18
- # warm up the JIT, etc
19
- puts "Doing a warmup run..."
20
- n.times do |i|
21
- s << 1
22
- s << i
23
- s.delete i
24
- s << i
25
- end
26
-
27
- t1 = Benchmark.realtime do
28
- n.times do |i|
29
- s << 1
30
- s << i
31
- s.delete i
32
- s << i
33
- s.length
34
- end
35
- end
36
- r1 = (n.to_f/t1.to_f)
37
-
38
- s2 = SynchronizedSortedSet.new
39
- t2 = Benchmark.realtime do
40
- n.times do |i|
41
- s2 << 1
42
- s2 << i
43
- s2.delete i
44
- s2 << i
45
- s2.length
46
- end
47
- end
48
- r2 = (n.to_f/t2.to_f)
49
-
50
- puts "Mixed sorted set ops, rate: #{(r1 / 1000).round(2)} KGHz"
51
- puts "Mixed synchronized sorted set ops, rate: #{(r2 / 1000).round(2)} KGHz"
52
- puts
53
- puts "-" * 80
@@ -1,49 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "benchmark"
4
-
5
- # This tests demonstrates throughput difference of
6
- # IO#write and IO#write_nonblock. Note that the two
7
- # may not be equivalent depending on your
8
-
9
- r, w = IO.pipe
10
-
11
- # buffer size
12
- b = 65536
13
-
14
- read_loop = Thread.new do
15
- loop do
16
- begin
17
- r.read_nonblock(b)
18
- rescue Errno::EWOULDBLOCK, Errno::EAGAIN => e
19
- IO.select([r])
20
- retry
21
- end
22
- end
23
- end
24
-
25
- n = 10_000
26
- # 7 KB
27
- s = "a" * (7 * 1024)
28
- Benchmark.bm do |meter|
29
- meter.report("write:") do
30
- n.times { w.write(s.dup) }
31
- end
32
- meter.report("write + flush:") do
33
- n.times { w.write(s.dup); w.flush }
34
- end
35
- meter.report("write_nonblock:") do
36
- n.times do
37
- s2 = s.dup
38
- begin
39
- while !s2.empty?
40
- written = w.write_nonblock(s2)
41
- s2.slice!(0, written)
42
- end
43
- rescue Errno::EWOULDBLOCK, Errno::EAGAIN
44
- IO.select([], [w])
45
- retry
46
- end
47
- end
48
- end
49
- end
data/bunny.gemspec DELETED
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env gem build
2
- # encoding: utf-8
3
-
4
- require "base64"
5
- require File.expand_path("../lib/bunny/version", __FILE__)
6
-
7
- Gem::Specification.new do |s|
8
- s.name = "bunny"
9
- s.version = Bunny::VERSION.dup
10
- s.homepage = "http://rubybunny.info"
11
- s.summary = "Easy to use Ruby client for RabbitMQ"
12
- s.description = "Easy to use, feature complete Ruby client for RabbitMQ"
13
- s.license = "MIT"
14
- s.required_ruby_version = Gem::Requirement.new(">= 2.2")
15
-
16
- # Sorted alphabetically.
17
- s.authors = [
18
- "Chris Duncan",
19
- "Eric Lindvall",
20
- "Jakub Stastny aka botanicus",
21
- "Michael S. Klishin",
22
- "Stefan Kaes"]
23
-
24
- s.email = ["mklishin@pivotal.io"]
25
-
26
- # Dependencies
27
- s.add_runtime_dependency 'amq-protocol', '~> 2.3', '>= 2.3.0'
28
-
29
- # Files.
30
- s.extra_rdoc_files = ["README.md"]
31
- s.files = `git ls-files`.split("\n").reject { |f| f.match(%r{^bin/ci/}) }
32
- s.test_files = `git ls-files -- spec/*`.split("\n")
33
- s.require_paths = ["lib"]
34
- end
data/docker-compose.yml DELETED
@@ -1,28 +0,0 @@
1
- version: '3.7'
2
- services:
3
- rabbitmq:
4
- build: ./docker
5
- container_name: bunny_rabbitmq
6
- environment:
7
- RABBITMQ_NODENAME: bunny
8
- # see CONTRIBUTING.md
9
- BUNNY_RABBITMQ_HOSTNAME: mercurio
10
- # link to spec specific configuration
11
- RABBITMQ_CONFIG_FILE: /spec/config/rabbitmq.conf
12
- RABBITMQ_ENABLED_PLUGINS_FILE: /spec/config/enabled_plugins
13
- # send logs to stdout
14
- RABBITMQ_LOGS: '-'
15
- RABBITMQ_SASL_LOGS: '-'
16
- ports:
17
- - 5671-5672:5671-5672
18
- - 15672:15672
19
- volumes:
20
- - ./spec:/spec:ro
21
- toxiproxy:
22
- container_name: toxiproxy
23
- image: shopify/toxiproxy
24
- ports:
25
- - 8474:8474
26
- - 11111:11111
27
- depends_on:
28
- - rabbitmq
data/docker/Dockerfile DELETED
@@ -1,24 +0,0 @@
1
- FROM ubuntu:18.04
2
-
3
- RUN apt-get update -y
4
- RUN apt-get install -y gnupg2 wget
5
- RUN wget -O - "https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc" | apt-key add -
6
-
7
- COPY apt/sources.list.d/bintray.rabbitmq.list /etc/apt/sources.list.d/bintray.rabbitmq.list
8
- COPY apt/preferences.d/erlang /etc/apt/preferences.d/erlang
9
-
10
- RUN apt-get update -y && apt-get upgrade -y
11
-
12
- RUN apt-get install -y erlang-base \
13
- erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
14
- erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
15
- erlang-runtime-tools erlang-snmp erlang-ssl \
16
- erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
17
-
18
- RUN apt-get install -y rabbitmq-server
19
-
20
- COPY docker-entrypoint.sh /
21
-
22
- ENTRYPOINT /docker-entrypoint.sh
23
-
24
- EXPOSE 5671 5672 15672
@@ -1,3 +0,0 @@
1
- Package: erlang*
2
- Pin: release o=Bintray
3
- Pin-Priority: 1000
@@ -1,2 +0,0 @@
1
- deb http://dl.bintray.com/rabbitmq-erlang/debian bionic erlang
2
- deb http://dl.bintray.com/rabbitmq/debian bionic main
@@ -1,26 +0,0 @@
1
- #!/bin/sh
2
- server=rabbitmq-server
3
- ctl=rabbitmqctl
4
- delay=5
5
-
6
- echo 'Starting a RabbitMQ node'
7
- $server -detached
8
-
9
- echo "Waiting for RabbitMQ to finish startup..."
10
-
11
- $ctl await_startup --timeout 15
12
-
13
- $ctl add_user bunny_gem bunny_password
14
- $ctl add_user bunny_reader reader_password
15
-
16
- $ctl add_vhost bunny_testbed
17
-
18
- $ctl set_permissions -p / guest '.*' '.*' '.*'
19
- $ctl set_permissions -p bunny_testbed bunny_gem '.*' '.*' '.*'
20
- $ctl set_permissions -p bunny_testbed guest '.*' '.*' '.*'
21
- $ctl set_permissions -p bunny_testbed bunny_reader '^---$' '^---$' '.*'
22
-
23
- $ctl shutdown --timeout 10
24
-
25
- echo 'Starting a RabbitMQ node in foreground (use Ctrl-C to stop)'
26
- exec $server
data/docker/rabbitmq.conf DELETED
@@ -1,29 +0,0 @@
1
- listeners.tcp.1 = 0.0.0.0:5672
2
-
3
- listeners.ssl.default = 5671
4
-
5
- ssl_options.cacertfile = /spec/tls/ca_certificate.pem
6
- ssl_options.certfile = /spec/tls/server_certificate.pem
7
- ssl_options.keyfile = /spec/tls/server_key.pem
8
- ssl_options.verify = verify_none
9
- ssl_options.fail_if_no_peer_cert = false
10
-
11
- ssl_options.honor_cipher_order = true
12
- ssl_options.honor_ecc_order = true
13
- ssl_options.client_renegotiation = false
14
- ssl_options.secure_renegotiate = true
15
-
16
- ssl_options.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
17
- ssl_options.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
18
- ssl_options.ciphers.3 = ECDH-ECDSA-AES256-GCM-SHA384
19
- ssl_options.ciphers.4 = ECDH-RSA-AES256-GCM-SHA384
20
- ssl_options.ciphers.5 = DHE-RSA-AES256-GCM-SHA384
21
- ssl_options.ciphers.6 = DHE-DSS-AES256-GCM-SHA384
22
- ssl_options.ciphers.7 = ECDHE-ECDSA-AES128-GCM-SHA256
23
- ssl_options.ciphers.8 = ECDHE-RSA-AES128-GCM-SHA256
24
- ssl_options.ciphers.9 = ECDH-ECDSA-AES128-GCM-SHA256
25
- ssl_options.ciphers.10 = ECDH-RSA-AES128-GCM-SHA256
26
- ssl_options.ciphers.11 = DHE-RSA-AES128-GCM-SHA256
27
- ssl_options.ciphers.12 = DHE-DSS-AES128-GCM-SHA256
28
-
29
- loopback_users = none
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require "bundler"
5
- Bundler.setup
6
-
7
- $:.unshift(File.expand_path("../../../lib", __FILE__))
8
-
9
- require 'bunny'
10
-
11
- begin
12
- conn = Bunny.new("amqp://guest8we78w7e8:guest2378278@127.0.0.1")
13
- conn.start
14
- rescue Bunny::PossibleAuthenticationFailureError => e
15
- puts "Could not authenticate as #{conn.username}"
16
- end
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require "bundler"
5
- Bundler.setup
6
-
7
- $:.unshift(File.expand_path("../../../lib", __FILE__))
8
-
9
- require 'bunny'
10
-
11
- conn = Bunny.new(:heartbeat_timeout => 8)
12
- conn.start
13
-
14
- ch = conn.create_channel
15
- x = ch.topic("bunny.examples.recovery.topic", :durable => false)
16
- q = ch.queue("bunny.examples.recovery.client_named_queue2", :durable => true)
17
- q.purge
18
-
19
- q.bind(x, :routing_key => "abc").bind(x, :routing_key => "def")
20
-
21
- loop do
22
- sleep 8
23
- body = rand.to_s
24
-
25
- begin
26
- x.publish(body, :routing_key => ["abc", "def"].sample)
27
- puts "Published #{body}"
28
- # happens when a message is published before the connection
29
- # is recovered
30
- rescue Exception => e
31
- end
32
-
33
- sleep 1.5
34
- _, _, payload = q.pop
35
- if payload
36
- puts "Consumed #{payload}"
37
- else
38
- puts "Consumed nothing"
39
- end
40
- end
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require "bundler"
5
- Bundler.setup
6
-
7
- $:.unshift(File.expand_path("../../../lib", __FILE__))
8
-
9
- require 'bunny'
10
-
11
- conn = Bunny.new(heartbeat_timeout: 8)
12
- conn.start
13
-
14
- ch = conn.create_channel
15
- x = ch.topic("bunny.examples.recovery.topic", :durable => false)
16
- q = ch.queue("bunny.examples.recovery.client_named_queue1", :durable => false)
17
-
18
- q.bind(x, :routing_key => "abc").bind(x, :routing_key => "def")
19
-
20
- q.subscribe do |delivery_info, metadata, payload|
21
- puts "Consumed #{payload}"
22
- end
23
-
24
- loop do
25
- sleep 2
26
- data = rand.to_s
27
- rk = ["abc", "def"].sample
28
-
29
- begin
30
- x.publish(data, :routing_key => rk)
31
- puts "Published #{data}, routing key: #{rk}"
32
- # happens when a message is published before the connection
33
- # is recovered
34
- rescue Exception => e
35
- end
36
- end
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require "bundler"
5
- Bundler.setup
6
-
7
- $:.unshift(File.expand_path("../../../lib", __FILE__))
8
-
9
- require 'bunny'
10
-
11
- conn = Bunny.new(heartbeat_timeout: 8)
12
- conn.start
13
-
14
- ch1 = conn.create_channel
15
- x1 = ch1.topic("bunny.examples.recovery.e1", :durable => false)
16
- q1 = ch1.queue("bunny.examples.recovery.q1", :durable => false)
17
-
18
- q1.bind(x1, :routing_key => "abc").bind(x1, :routing_key => "def")
19
-
20
- ch2 = conn.create_channel
21
- x2 = ch2.topic("bunny.examples.recovery.e2", :durable => false)
22
- q2 = ch2.queue("bunny.examples.recovery.q2", :durable => false)
23
-
24
- q2.bind(x2, :routing_key => "abc").bind(x2, :routing_key => "def")
25
-
26
- q1.subscribe do |delivery_info, metadata, payload|
27
- puts "Consumed #{payload} at stage one"
28
- x2.publish(payload, :routing_key => ["abc", "def", "xyz"].sample)
29
- end
30
-
31
- q2.subscribe do |delivery_info, metadata, payload|
32
- puts "Consumed #{payload} at stage two"
33
- end
34
-
35
- loop do
36
- sleep 2
37
- rk = ["abc", "def", "ghi", "xyz"].sample
38
- puts "Publishing with routing key #{rk}"
39
-
40
- begin
41
- x1.publish(rand.to_s, :routing_key => rk)
42
- # happens when a message is published before the connection
43
- # is recovered
44
- rescue Bunny::ConnectionClosedError => e
45
- end
46
- end
@@ -1,109 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- require "bundler"
5
- Bundler.setup
6
-
7
- $:.unshift(File.expand_path("../../../lib", __FILE__))
8
-
9
- require 'Bunny'
10
-
11
- conn = Bunny.new(:heartbeat_timeout => 8)
12
- conn.start
13
-
14
- ch0 = conn.create_channel
15
- ch1 = conn.create_channel
16
- ch2 = conn.create_channel
17
- ch3 = conn.create_channel
18
-
19
- x = ch1.topic("hb.examples.recovery.topic", :durable => false)
20
- q1 = ch1.queue("hb.examples.recovery.client_named_queue1", :durable => false)
21
- q2 = ch2.queue("hb.examples.recovery.client_named_queue2", :durable => false)
22
- q3 = ch3.queue("hb.examples.recovery.client_named_queue3", :durable => false)
23
-
24
- q1.bind(x, :routing_key => "abc")
25
- q2.bind(x, :routing_key => "def")
26
- q3.bind(x, :routing_key => "xyz")
27
-
28
- x0 = ch0.fanout("hb.examples.recovery.fanout0")
29
- x1 = ch1.fanout("hb.examples.recovery.fanout1")
30
- x2 = ch2.fanout("hb.examples.recovery.fanout2")
31
- x3 = ch3.fanout("hb.examples.recovery.fanout3")
32
-
33
- q4 = ch1.queue("", :exclusive => true)
34
- q4.bind(x0)
35
-
36
- q5 = ch2.queue("", :exclusive => true)
37
- q5.bind(x1)
38
-
39
- q6 = ch3.queue("", :exclusive => true)
40
- q6.bind(x2)
41
- q6.bind(x3)
42
-
43
-
44
- q1.subscribe do |delivery_info, metadata, payload|
45
- puts "[Q1] Consumed #{payload} on channel #{q1.channel.id}"
46
- if ch0.open?
47
- puts "Publishing a reply on channel #{ch0.id} which is open"
48
- x0.publish(Time.now.to_i.to_s)
49
- end
50
- end
51
-
52
- q2.subscribe do |delivery_info, metadata, payload|
53
- puts "[Q2] Consumed #{payload} on channel #{q2.channel.id}"
54
-
55
- if ch1.open?
56
- puts "Publishing a reply on channel #{ch1.id} which is open"
57
- x1.publish(Time.now.to_i.to_s)
58
- end
59
- end
60
-
61
- q3.subscribe do |delivery_info, metadata, payload|
62
- puts "[Q3] Consumed #{payload} (consumer 1, channel #{q3.channel.id})"
63
-
64
- if ch2.open?
65
- puts "Publishing a reply on channel #{ch1.id} which is open"
66
- x2.publish(Time.now.to_i.to_s)
67
- end
68
- end
69
-
70
- q3.subscribe do |delivery_info, metadata, payload|
71
- puts "[Q3] Consumed #{payload} (consumer 2, channel #{q3.channel.id})"
72
-
73
- if ch3.open?
74
- puts "Publishing a reply on channel #{ch3.id} which is open"
75
- x3.publish(Time.now.to_i.to_s)
76
- end
77
- end
78
-
79
- q4.subscribe do |delivery_info, metadata, payload|
80
- puts "[Q4] Consumed #{payload} on channel #{q4.channel.id}"
81
- end
82
-
83
- q5.subscribe do |delivery_info, metadata, payload|
84
- puts "[Q5] Consumed #{payload} on channel #{q5.channel.id}"
85
- end
86
-
87
- q6.subscribe do |delivery_info, metadata, payload|
88
- puts "[Q6] Consumed #{payload} on channel #{q6.channel.id}"
89
- end
90
-
91
- loop do
92
- sleep 1
93
- data = rand.to_s
94
- rk = ["abc", "def", "xyz", Time.now.to_i.to_s].sample
95
-
96
- begin
97
- 3.times do
98
- x.publish(rand.to_s, :routing_key => rk)
99
- puts "Published #{data}, routing key: #{rk} on channel #{x.channel.id}"
100
- end
101
- # happens when a message is published before the connection
102
- # is recovered
103
- rescue Exception => e
104
- puts "Exception: #{e.message}"
105
- # e.backtrace.each do |line|
106
- # puts "\t#{line}"
107
- # end
108
- end
109
- end