bunny 0.10.8 → 1.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -4
- data/ChangeLog.md +1 -152
- data/Gemfile +1 -1
- data/README.md +5 -5
- data/bunny.gemspec +1 -1
- data/lib/bunny.rb +14 -2
- data/lib/bunny/channel.rb +94 -158
- data/lib/bunny/channel_id_allocator.rb +1 -2
- data/lib/bunny/concurrent/condition.rb +1 -2
- data/lib/bunny/concurrent/continuation_queue.rb +1 -1
- data/lib/bunny/consumer.rb +0 -13
- data/lib/bunny/consumer_work_pool.rb +2 -5
- data/lib/bunny/delivery_info.rb +1 -3
- data/lib/bunny/exceptions.rb +1 -4
- data/lib/bunny/heartbeat_sender.rb +1 -1
- data/lib/bunny/reader_loop.rb +3 -23
- data/lib/bunny/session.rb +19 -103
- data/lib/bunny/socket.rb +1 -1
- data/lib/bunny/transport.rb +7 -31
- data/lib/bunny/version.rb +1 -1
- data/spec/higher_level_api/integration/basic_ack_spec.rb +19 -34
- data/spec/higher_level_api/integration/basic_cancel_spec.rb +1 -1
- data/spec/higher_level_api/integration/basic_consume_spec.rb +2 -63
- data/spec/higher_level_api/integration/basic_get_spec.rb +1 -1
- data/spec/higher_level_api/integration/basic_nack_spec.rb +1 -1
- data/spec/higher_level_api/integration/basic_publish_spec.rb +1 -1
- data/spec/higher_level_api/integration/basic_qos_spec.rb +8 -5
- data/spec/higher_level_api/integration/basic_reject_spec.rb +17 -16
- data/spec/higher_level_api/integration/basic_return_spec.rb +1 -1
- data/spec/higher_level_api/integration/channel_close_spec.rb +10 -6
- data/spec/higher_level_api/integration/channel_flow_spec.rb +9 -6
- data/spec/higher_level_api/integration/channel_open_spec.rb +20 -11
- data/spec/higher_level_api/integration/confirm_select_spec.rb +1 -1
- data/spec/higher_level_api/integration/connection_spec.rb +1 -1
- data/spec/higher_level_api/integration/consistent_hash_exchange_spec.rb +1 -1
- data/spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb +1 -46
- data/spec/higher_level_api/integration/dead_lettering_spec.rb +1 -1
- data/spec/higher_level_api/integration/exchange_bind_spec.rb +1 -1
- data/spec/higher_level_api/integration/exchange_declare_spec.rb +1 -1
- data/spec/higher_level_api/integration/exchange_delete_spec.rb +1 -1
- data/spec/higher_level_api/integration/exchange_unbind_spec.rb +1 -1
- data/spec/higher_level_api/integration/merry_go_round_spec.rb +1 -1
- data/spec/higher_level_api/integration/message_properties_access_spec.rb +1 -1
- data/spec/higher_level_api/integration/predeclared_exchanges_spec.rb +1 -1
- data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +1 -1
- data/spec/higher_level_api/integration/queue_declare_spec.rb +1 -1
- data/spec/higher_level_api/integration/queue_delete_spec.rb +2 -2
- data/spec/higher_level_api/integration/queue_purge_spec.rb +1 -1
- data/spec/higher_level_api/integration/queue_unbind_spec.rb +2 -2
- data/spec/higher_level_api/integration/read_only_consumer_spec.rb +1 -1
- data/spec/higher_level_api/integration/sender_selected_distribution_spec.rb +2 -2
- data/spec/higher_level_api/integration/tls_connection_spec.rb +2 -86
- data/spec/higher_level_api/integration/tx_commit_spec.rb +1 -1
- data/spec/higher_level_api/integration/tx_rollback_spec.rb +1 -1
- data/spec/unit/concurrent/condition_spec.rb +46 -53
- metadata +5 -25
- data/benchmarks/mutex_and_monitor.rb +0 -42
- data/benchmarks/synchronized_sorted_set.rb +0 -53
- data/lib/amq/protocol/extensions.rb +0 -16
- data/lib/bunny/concurrent/atomic_fixnum.rb +0 -74
- data/lib/bunny/concurrent/synchronized_sorted_set.rb +0 -56
- data/lib/bunny/timeout.rb +0 -18
- data/lib/bunny/versioned_delivery_tag.rb +0 -28
- data/spec/higher_level_api/integration/connection_stop_spec.rb +0 -26
- data/spec/higher_level_api/integration/exclusive_queue_spec.rb +0 -28
- data/spec/issues/issue141_spec.rb +0 -44
- data/spec/stress/connection_open_close_spec.rb +0 -40
- data/spec/unit/concurrent/atomic_fixnum_spec.rb +0 -35
- data/spec/unit/concurrent/synchronized_sorted_set_spec.rb +0 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae97d1a6c3f9bd4e72d67961007677f20b86636b
|
4
|
+
data.tar.gz: d7fd9c501d71379469e61f68e99d0d3292bc3b32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c405d0617f646cffc2f5fb8ab9950277e1913ed131c6c7aeba95a8ac89742dfe5f56f24332753c7ed1de6ed7490affd33c619f0eaafa9dc6d76cc6c000c64233
|
7
|
+
data.tar.gz: 39cd8727b32ad97113fe5f5f07197da4c3b8fa884de2a86201c00603f2a5df7037a9778653ab19b20b4972e992f296e791fb15c13ffcfe25f42eaa3e517cd837
|
data/.travis.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
bundler_args: --without development
|
2
2
|
before_script: "./bin/ci/before_build.sh"
|
3
|
-
script: "bundle exec rspec -
|
3
|
+
script: "bundle exec rspec -c spec"
|
4
4
|
rvm:
|
5
5
|
- "2.0"
|
6
6
|
- "1.9.3"
|
@@ -15,6 +15,3 @@ branches:
|
|
15
15
|
only:
|
16
16
|
- master
|
17
17
|
- 0.9.x-stable
|
18
|
-
matrix:
|
19
|
-
allow_failures:
|
20
|
-
- rvm: rbx-19mode
|
data/ChangeLog.md
CHANGED
@@ -1,155 +1,4 @@
|
|
1
|
-
## Changes between Bunny 0.
|
2
|
-
|
3
|
-
### Add timeout Bunny::ConsumerWorkPool#join
|
4
|
-
|
5
|
-
`Bunny::ConsumerWorkPool#join` now accepts an optional
|
6
|
-
timeout argument.
|
7
|
-
|
8
|
-
|
9
|
-
## Changes between Bunny 0.10.5 and 0.10.6
|
10
|
-
|
11
|
-
### Respect RABBITMQ_URL value
|
12
|
-
|
13
|
-
`RABBITMQ_URL` env variable will now have effect even if
|
14
|
-
Bunny.new is invoked without arguments.
|
15
|
-
|
16
|
-
Contributed by Robert Ross.
|
17
|
-
|
18
|
-
|
19
|
-
## Changes between Bunny 0.10.4 and 0.10.5
|
20
|
-
|
21
|
-
### Bunny::Session.parse_uri
|
22
|
-
|
23
|
-
`Bunny::Session.parse_uri` is a new method that parses
|
24
|
-
connection URIs into hashes that `Bunny::Session#initialize`
|
25
|
-
accepts.
|
26
|
-
|
27
|
-
``` ruby
|
28
|
-
Bunny::Session.parse_uri("amqp://user:pwd@broker.eng.megacorp.local/myapp_qa")
|
29
|
-
```
|
30
|
-
|
31
|
-
|
32
|
-
## Changes between Bunny 0.10.3 and 0.10.4
|
33
|
-
|
34
|
-
### Default Paths for TLS/SSL CA's on All OS'es
|
35
|
-
|
36
|
-
Bunny now uses OpenSSL to detect default TLS/SSL CA's paths, extending
|
37
|
-
this feature to OS'es other than Linux.
|
38
|
-
|
39
|
-
Contributed by Jingwen Owen Ou.
|
40
|
-
|
41
|
-
|
42
|
-
## Changes between Bunny 0.10.2 and 0.10.3
|
43
|
-
|
44
|
-
### Default Paths for TLS/SSL CA's on Linux
|
45
|
-
|
46
|
-
Bunny now will use the following TLS/SSL CA's paths on Linux by default:
|
47
|
-
|
48
|
-
* `/etc/ssl/certs/ca-certificates.crt` on Ubuntu/Debian
|
49
|
-
* `/etc/ssl/certs/ca-bundle.crt` on Amazon Linux
|
50
|
-
* `/etc/ssl/ca-bundle.pem` on OpenSUSE
|
51
|
-
* `/etc/pki/tls/certs/ca-bundle.crt` on Fedora/RHEL
|
52
|
-
|
53
|
-
and will log a warning if no CA files are available via default paths
|
54
|
-
or `:tls_ca_certificates`.
|
55
|
-
|
56
|
-
Contributed by Carl Hörberg.
|
57
|
-
|
58
|
-
|
59
|
-
## Changes between Bunny 0.10.1 and 0.10.2
|
60
|
-
|
61
|
-
### Consumers Can Be Re-Registered From Bunny::Consumer#handle_cancellation
|
62
|
-
|
63
|
-
It is now possible to re-register a consumer (and use any other synchronous methods)
|
64
|
-
from `Bunny::Consumer#handle_cancellation`, which is now invoked in the channel's
|
65
|
-
thread pool.
|
66
|
-
|
67
|
-
|
68
|
-
### Bunny::Session#close Fixed for Single Threaded Connections
|
69
|
-
|
70
|
-
`Bunny::Session#close` with single threaded connections no longer fails
|
71
|
-
with a nil pointer exception.
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
## Changes between Bunny 0.10.0 and 0.10.1
|
76
|
-
|
77
|
-
### Fix Abnormally Slow Bunny::Connection#close on JRuby
|
78
|
-
|
79
|
-
`Bunny::Connection#close` on JRuby sometimes could enter a waiting
|
80
|
-
state [on a native NIO/kqueue method] that lasted up to over 10 seconds.
|
81
|
-
|
82
|
-
This severely affected test suite run times.
|
83
|
-
|
84
|
-
|
85
|
-
## Changes between Bunny 0.9.0 and 0.10.0
|
86
|
-
|
87
|
-
This release has one minor **breaking API change**.
|
88
|
-
|
89
|
-
### Safe[r] basic.ack, basic.nack and basic.reject implementation
|
90
|
-
|
91
|
-
Previously if a channel was recovered (reopened) by automatic connection
|
92
|
-
recovery before a message was acknowledged or rejected, it would cause
|
93
|
-
any operation on the channel that uses delivery tags to fail and
|
94
|
-
cause the channel to be closed.
|
95
|
-
|
96
|
-
To avoid this issue, every channel keeps a counter of how many times
|
97
|
-
it has been reopened and marks delivery tags with them. Using a stale
|
98
|
-
tag to ack or reject a message will produce no method sent to RabbitMQ.
|
99
|
-
Note that unacknowledged messages will be requeued by RabbitMQ when connection
|
100
|
-
goes down anyway.
|
101
|
-
|
102
|
-
This involves an API change: `Bunny::DeliveryMetadata#delivery_tag` is now
|
103
|
-
and instance of a class that responds to `#tag` and `#to_i` and is accepted
|
104
|
-
by `Bunny::Channel#ack` and related methods.
|
105
|
-
|
106
|
-
Integers are still accepted by the same methods.
|
107
|
-
|
108
|
-
|
109
|
-
### Exclusivity Violation for Consumers Now Raises a Reasonable Exception
|
110
|
-
|
111
|
-
When a second consumer is registered for the same queue on different channels,
|
112
|
-
a reasonable exception (`Bunny::AccessRefused`) will be raised.
|
113
|
-
|
114
|
-
|
115
|
-
### Reentrant Mutex Implementation
|
116
|
-
|
117
|
-
Bunny now allows mutex impl to be configurable, uses reentrant Monitor
|
118
|
-
by default.
|
119
|
-
|
120
|
-
Non-reentrant mutexes is a major PITA and may affect code that
|
121
|
-
uses Bunny.
|
122
|
-
|
123
|
-
Avg. publishing throughput with Monitor drops slightly from
|
124
|
-
5.73 Khz to 5.49 Khz (about 4% decrease), which is reasonable
|
125
|
-
for Bunny.
|
126
|
-
|
127
|
-
Apps that need these 4% can configure what mutex implementation
|
128
|
-
is used on per-connection basis.
|
129
|
-
|
130
|
-
### Eliminated Race Condition in Bunny::Session#close
|
131
|
-
|
132
|
-
`Bunny::Session#close` had a race condition that caused (non-deterministic)
|
133
|
-
exceptions when connection transport was closed before connection
|
134
|
-
reader loop was guaranteed to have stopped.
|
135
|
-
|
136
|
-
### connection.close Raises Exceptions on Connection Thread
|
137
|
-
|
138
|
-
Connection-level exceptions (including when a connection is closed via
|
139
|
-
management UI or `rabbitmqctl`) will now be raised on the connection
|
140
|
-
thread so they
|
141
|
-
|
142
|
-
* can be handled by applications
|
143
|
-
* do not start connection recovery, which may be uncalled for
|
144
|
-
|
145
|
-
### Client TLS Certificates are Optional
|
146
|
-
|
147
|
-
Bunny will no longer require client TLS certificates. Note that CA certificate
|
148
|
-
list is still necessary.
|
149
|
-
|
150
|
-
If RabbitMQ TLS configuration requires peer verification, client certificate
|
151
|
-
and private key are mandatory.
|
152
|
-
|
1
|
+
## Changes between Bunny 0.9.0 and 1.0.0.pre1
|
153
2
|
|
154
3
|
### Publishing Over Closed Connections
|
155
4
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -79,7 +79,7 @@ backwards compatible as possible but within reason.
|
|
79
79
|
|
80
80
|
### With Rubygems
|
81
81
|
|
82
|
-
To install Bunny with RubyGems:
|
82
|
+
To install Bunny 0.9.x with RubyGems:
|
83
83
|
|
84
84
|
```
|
85
85
|
gem install bunny
|
@@ -87,17 +87,17 @@ gem install bunny
|
|
87
87
|
|
88
88
|
### Bundler Dependency
|
89
89
|
|
90
|
-
To use Bunny in a project managed with Bundler:
|
90
|
+
To use Bunny 0.9.x in a project managed with Bundler:
|
91
91
|
|
92
92
|
``` ruby
|
93
|
-
gem "bunny", ">= 0.
|
93
|
+
gem "bunny", ">= 0.9.3"
|
94
94
|
```
|
95
95
|
|
96
96
|
|
97
|
-
## Quick Start
|
97
|
+
## Quick Start for Bunny 0.9.x
|
98
98
|
|
99
99
|
Below is a small snippet that demonstrates how to publish
|
100
|
-
and synchronously consume ("pull API") messages with Bunny.
|
100
|
+
and synchronously consume ("pull API") messages with Bunny 0.9.
|
101
101
|
|
102
102
|
For a 15 minute tutorial using more practical examples, see [Getting Started with RabbitMQ and Ruby using Bunny](http://rubybunny.info/articles/getting_started.html).
|
103
103
|
|
data/bunny.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.version = Bunny::VERSION.dup
|
10
10
|
s.homepage = "http://rubybunny.info"
|
11
11
|
s.summary = "Popular easy to use Ruby client for RabbitMQ"
|
12
|
-
s.description = "Easy to use, feature complete Ruby client for RabbitMQ 2.0
|
12
|
+
s.description = "Easy to use, feature complete Ruby client for RabbitMQ 2.0."
|
13
13
|
s.license = "MIT"
|
14
14
|
|
15
15
|
# Sorted alphabetically.
|
data/lib/bunny.rb
CHANGED
@@ -4,12 +4,10 @@ require "timeout"
|
|
4
4
|
|
5
5
|
require "bunny/version"
|
6
6
|
require "amq/protocol/client"
|
7
|
-
require "amq/protocol/extensions"
|
8
7
|
|
9
8
|
require "bunny/framing"
|
10
9
|
require "bunny/exceptions"
|
11
10
|
require "bunny/socket"
|
12
|
-
require "bunny/timeout"
|
13
11
|
|
14
12
|
begin
|
15
13
|
require "openssl"
|
@@ -34,6 +32,20 @@ module Bunny
|
|
34
32
|
# AMQP protocol version Bunny implements
|
35
33
|
PROTOCOL_VERSION = AMQ::Protocol::PROTOCOL_VERSION
|
36
34
|
|
35
|
+
# unifies Ruby standard library's Timeout (which is not accurate on
|
36
|
+
# Ruby 1.8 and has other issues) and SystemTimer (the gem)
|
37
|
+
Timer = if RUBY_VERSION < "1.9"
|
38
|
+
begin
|
39
|
+
require "bunny/system_timer"
|
40
|
+
Bunny::SystemTimer
|
41
|
+
rescue LoadError
|
42
|
+
Timeout
|
43
|
+
end
|
44
|
+
else
|
45
|
+
Timeout
|
46
|
+
end
|
47
|
+
|
48
|
+
|
37
49
|
#
|
38
50
|
# API
|
39
51
|
#
|
data/lib/bunny/channel.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "thread"
|
3
|
-
require "monitor"
|
4
3
|
require "set"
|
5
4
|
|
6
|
-
require "bunny/concurrent/atomic_fixnum"
|
7
5
|
require "bunny/consumer_work_pool"
|
8
6
|
|
9
7
|
require "bunny/exchange"
|
@@ -175,10 +173,10 @@ module Bunny
|
|
175
173
|
@work_pool = work_pool
|
176
174
|
|
177
175
|
# synchronizes frameset delivery. MK.
|
178
|
-
@publishing_mutex =
|
179
|
-
@consumer_mutex =
|
176
|
+
@publishing_mutex = Mutex.new
|
177
|
+
@consumer_mutex = Mutex.new
|
180
178
|
|
181
|
-
@unconfirmed_set_mutex =
|
179
|
+
@unconfirmed_set_mutex = Mutex.new
|
182
180
|
|
183
181
|
self.reset_continuations
|
184
182
|
|
@@ -190,12 +188,8 @@ module Bunny
|
|
190
188
|
@threads_waiting_on_basic_get_continuations = Set.new
|
191
189
|
|
192
190
|
@next_publish_seq_no = 0
|
193
|
-
|
194
|
-
@recoveries_counter = Bunny::Concurrent::AtomicFixnum.new(0)
|
195
191
|
end
|
196
192
|
|
197
|
-
attr_reader :recoveries_counter
|
198
|
-
|
199
193
|
# @private
|
200
194
|
def read_write_timeout
|
201
195
|
@connection.read_write_timeout
|
@@ -443,9 +437,7 @@ module Bunny
|
|
443
437
|
# @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
|
444
438
|
# @api public
|
445
439
|
def reject(delivery_tag, requeue = false)
|
446
|
-
|
447
|
-
basic_reject(delivery_tag.to_i, requeue)
|
448
|
-
end
|
440
|
+
basic_reject(delivery_tag, requeue)
|
449
441
|
end
|
450
442
|
|
451
443
|
# Acknowledges a message. Acknowledged messages are completely removed from the queue.
|
@@ -456,9 +448,7 @@ module Bunny
|
|
456
448
|
# @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
|
457
449
|
# @api public
|
458
450
|
def ack(delivery_tag, multiple = false)
|
459
|
-
|
460
|
-
basic_ack(delivery_tag.to_i, multiple)
|
461
|
-
end
|
451
|
+
basic_ack(delivery_tag, multiple)
|
462
452
|
end
|
463
453
|
alias acknowledge ack
|
464
454
|
|
@@ -473,9 +463,7 @@ module Bunny
|
|
473
463
|
# @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
|
474
464
|
# @api public
|
475
465
|
def nack(delivery_tag, multiple = false, requeue = false)
|
476
|
-
|
477
|
-
basic_nack(delivery_tag.to_i, multiple, requeue)
|
478
|
-
end
|
466
|
+
basic_nack(delivery_tag, multiple, requeue)
|
479
467
|
end
|
480
468
|
|
481
469
|
# @endgroup
|
@@ -533,13 +521,13 @@ module Bunny
|
|
533
521
|
end
|
534
522
|
|
535
523
|
m = AMQ::Protocol::Basic::Publish.encode(@id,
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
524
|
+
payload,
|
525
|
+
meta,
|
526
|
+
exchange_name,
|
527
|
+
routing_key,
|
528
|
+
meta[:mandatory],
|
529
|
+
false,
|
530
|
+
@connection.frame_max)
|
543
531
|
@connection.send_frameset_without_timeout(m, self)
|
544
532
|
|
545
533
|
self
|
@@ -602,7 +590,7 @@ module Bunny
|
|
602
590
|
|
603
591
|
@connection.send_frame(AMQ::Protocol::Basic::Qos.encode(@id, 0, prefetch_count, global))
|
604
592
|
|
605
|
-
Bunny::
|
593
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
606
594
|
@last_basic_qos_ok = wait_on_continuations
|
607
595
|
end
|
608
596
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -621,7 +609,7 @@ module Bunny
|
|
621
609
|
raise_if_no_longer_open!
|
622
610
|
|
623
611
|
@connection.send_frame(AMQ::Protocol::Basic::Recover.encode(@id, requeue))
|
624
|
-
Bunny::
|
612
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
625
613
|
@last_basic_recover_ok = wait_on_continuations
|
626
614
|
end
|
627
615
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -712,7 +700,6 @@ module Bunny
|
|
712
700
|
# ch.basic_ack(delivery_info.delivery_tag, true)
|
713
701
|
#
|
714
702
|
# @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
|
715
|
-
# @see #basic_ack_known_delivery_tag
|
716
703
|
# @api public
|
717
704
|
def basic_ack(delivery_tag, multiple)
|
718
705
|
raise_if_no_longer_open!
|
@@ -777,9 +764,9 @@ module Bunny
|
|
777
764
|
def basic_nack(delivery_tag, multiple = false, requeue = false)
|
778
765
|
raise_if_no_longer_open!
|
779
766
|
@connection.send_frame(AMQ::Protocol::Basic::Nack.encode(@id,
|
780
|
-
|
781
|
-
|
782
|
-
|
767
|
+
delivery_tag,
|
768
|
+
multiple,
|
769
|
+
requeue))
|
783
770
|
|
784
771
|
nil
|
785
772
|
end
|
@@ -814,16 +801,16 @@ module Bunny
|
|
814
801
|
end
|
815
802
|
|
816
803
|
@connection.send_frame(AMQ::Protocol::Basic::Consume.encode(@id,
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
804
|
+
queue_name,
|
805
|
+
consumer_tag,
|
806
|
+
false,
|
807
|
+
no_ack,
|
808
|
+
exclusive,
|
809
|
+
false,
|
810
|
+
arguments))
|
824
811
|
|
825
812
|
begin
|
826
|
-
Bunny::
|
813
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
827
814
|
@last_basic_consume_ok = wait_on_continuations
|
828
815
|
end
|
829
816
|
rescue Exception => e
|
@@ -834,16 +821,11 @@ module Bunny
|
|
834
821
|
raise e
|
835
822
|
end
|
836
823
|
|
837
|
-
# in case there is another exclusive consumer and we get a channel.close
|
838
|
-
# response here. MK.
|
839
|
-
raise_if_channel_close!(@last_basic_consume_ok)
|
840
|
-
|
841
824
|
# covers server-generated consumer tags
|
842
825
|
add_consumer(queue_name, @last_basic_consume_ok.consumer_tag, no_ack, exclusive, arguments, &block)
|
843
826
|
|
844
827
|
@last_basic_consume_ok
|
845
828
|
end
|
846
|
-
alias consume basic_consume
|
847
829
|
|
848
830
|
# Registers a consumer for queue as {Bunny::Consumer} instance.
|
849
831
|
#
|
@@ -864,16 +846,16 @@ module Bunny
|
|
864
846
|
end
|
865
847
|
|
866
848
|
@connection.send_frame(AMQ::Protocol::Basic::Consume.encode(@id,
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
849
|
+
consumer.queue_name,
|
850
|
+
consumer.consumer_tag,
|
851
|
+
false,
|
852
|
+
consumer.no_ack,
|
853
|
+
consumer.exclusive,
|
854
|
+
false,
|
855
|
+
consumer.arguments))
|
874
856
|
|
875
857
|
begin
|
876
|
-
Bunny::
|
858
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
877
859
|
@last_basic_consume_ok = wait_on_continuations
|
878
860
|
end
|
879
861
|
rescue Exception => e
|
@@ -884,10 +866,6 @@ module Bunny
|
|
884
866
|
raise e
|
885
867
|
end
|
886
868
|
|
887
|
-
# in case there is another exclusive consumer and we get a channel.close
|
888
|
-
# response here. MK.
|
889
|
-
raise_if_channel_close!(@last_basic_consume_ok)
|
890
|
-
|
891
869
|
# covers server-generated consumer tags
|
892
870
|
register_consumer(@last_basic_consume_ok.consumer_tag, consumer)
|
893
871
|
|
@@ -895,7 +873,6 @@ module Bunny
|
|
895
873
|
|
896
874
|
@last_basic_consume_ok
|
897
875
|
end
|
898
|
-
alias consume_with basic_consume_with
|
899
876
|
|
900
877
|
# Removes a consumer. Messages for this consumer will no longer be delivered. If the queue
|
901
878
|
# it was on is auto-deleted and this consumer was the last one, the queue will be deleted.
|
@@ -908,7 +885,7 @@ module Bunny
|
|
908
885
|
def basic_cancel(consumer_tag)
|
909
886
|
@connection.send_frame(AMQ::Protocol::Basic::Cancel.encode(@id, consumer_tag, false))
|
910
887
|
|
911
|
-
Bunny::
|
888
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
912
889
|
@last_basic_cancel_ok = wait_on_continuations
|
913
890
|
end
|
914
891
|
|
@@ -949,13 +926,13 @@ module Bunny
|
|
949
926
|
raise_if_no_longer_open!
|
950
927
|
|
951
928
|
@connection.send_frame(AMQ::Protocol::Queue::Declare.encode(@id,
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
929
|
+
name,
|
930
|
+
opts.fetch(:passive, false),
|
931
|
+
opts.fetch(:durable, false),
|
932
|
+
opts.fetch(:exclusive, false),
|
933
|
+
opts.fetch(:auto_delete, false),
|
934
|
+
false,
|
935
|
+
opts[:arguments]))
|
959
936
|
@last_queue_declare_ok = wait_on_continuations
|
960
937
|
|
961
938
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -978,11 +955,11 @@ module Bunny
|
|
978
955
|
raise_if_no_longer_open!
|
979
956
|
|
980
957
|
@connection.send_frame(AMQ::Protocol::Queue::Delete.encode(@id,
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
Bunny::
|
958
|
+
name,
|
959
|
+
opts[:if_unused],
|
960
|
+
opts[:if_empty],
|
961
|
+
false))
|
962
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
986
963
|
@last_queue_delete_ok = wait_on_continuations
|
987
964
|
end
|
988
965
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1002,7 +979,7 @@ module Bunny
|
|
1002
979
|
|
1003
980
|
@connection.send_frame(AMQ::Protocol::Queue::Purge.encode(@id, name, false))
|
1004
981
|
|
1005
|
-
Bunny::
|
982
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1006
983
|
@last_queue_purge_ok = wait_on_continuations
|
1007
984
|
end
|
1008
985
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1033,12 +1010,12 @@ module Bunny
|
|
1033
1010
|
end
|
1034
1011
|
|
1035
1012
|
@connection.send_frame(AMQ::Protocol::Queue::Bind.encode(@id,
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
1041
|
-
Bunny::
|
1013
|
+
name,
|
1014
|
+
exchange_name,
|
1015
|
+
opts[:routing_key],
|
1016
|
+
false,
|
1017
|
+
opts[:arguments]))
|
1018
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1042
1019
|
@last_queue_bind_ok = wait_on_continuations
|
1043
1020
|
end
|
1044
1021
|
|
@@ -1069,11 +1046,11 @@ module Bunny
|
|
1069
1046
|
end
|
1070
1047
|
|
1071
1048
|
@connection.send_frame(AMQ::Protocol::Queue::Unbind.encode(@id,
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
Bunny::
|
1049
|
+
name,
|
1050
|
+
exchange_name,
|
1051
|
+
opts[:routing_key],
|
1052
|
+
opts[:arguments]))
|
1053
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1077
1054
|
@last_queue_unbind_ok = wait_on_continuations
|
1078
1055
|
end
|
1079
1056
|
|
@@ -1104,15 +1081,15 @@ module Bunny
|
|
1104
1081
|
raise_if_no_longer_open!
|
1105
1082
|
|
1106
1083
|
@connection.send_frame(AMQ::Protocol::Exchange::Declare.encode(@id,
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
Bunny::
|
1084
|
+
name,
|
1085
|
+
type.to_s,
|
1086
|
+
opts.fetch(:passive, false),
|
1087
|
+
opts.fetch(:durable, false),
|
1088
|
+
opts.fetch(:auto_delete, false),
|
1089
|
+
false,
|
1090
|
+
false,
|
1091
|
+
opts[:arguments]))
|
1092
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1116
1093
|
@last_exchange_declare_ok = wait_on_continuations
|
1117
1094
|
end
|
1118
1095
|
|
@@ -1134,10 +1111,10 @@ module Bunny
|
|
1134
1111
|
raise_if_no_longer_open!
|
1135
1112
|
|
1136
1113
|
@connection.send_frame(AMQ::Protocol::Exchange::Delete.encode(@id,
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
Bunny::
|
1114
|
+
name,
|
1115
|
+
opts[:if_unused],
|
1116
|
+
false))
|
1117
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1141
1118
|
@last_exchange_delete_ok = wait_on_continuations
|
1142
1119
|
end
|
1143
1120
|
|
@@ -1176,12 +1153,12 @@ module Bunny
|
|
1176
1153
|
end
|
1177
1154
|
|
1178
1155
|
@connection.send_frame(AMQ::Protocol::Exchange::Bind.encode(@id,
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
Bunny::
|
1156
|
+
destination_name,
|
1157
|
+
source_name,
|
1158
|
+
opts[:routing_key],
|
1159
|
+
false,
|
1160
|
+
opts[:arguments]))
|
1161
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1185
1162
|
@last_exchange_bind_ok = wait_on_continuations
|
1186
1163
|
end
|
1187
1164
|
|
@@ -1220,12 +1197,12 @@ module Bunny
|
|
1220
1197
|
end
|
1221
1198
|
|
1222
1199
|
@connection.send_frame(AMQ::Protocol::Exchange::Unbind.encode(@id,
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
Bunny::
|
1200
|
+
destination_name,
|
1201
|
+
source_name,
|
1202
|
+
opts[:routing_key],
|
1203
|
+
false,
|
1204
|
+
opts[:arguments]))
|
1205
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1229
1206
|
@last_exchange_unbind_ok = wait_on_continuations
|
1230
1207
|
end
|
1231
1208
|
|
@@ -1253,7 +1230,7 @@ module Bunny
|
|
1253
1230
|
raise_if_no_longer_open!
|
1254
1231
|
|
1255
1232
|
@connection.send_frame(AMQ::Protocol::Channel::Flow.encode(@id, active))
|
1256
|
-
Bunny::
|
1233
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1257
1234
|
@last_channel_flow_ok = wait_on_continuations
|
1258
1235
|
end
|
1259
1236
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1274,7 +1251,7 @@ module Bunny
|
|
1274
1251
|
raise_if_no_longer_open!
|
1275
1252
|
|
1276
1253
|
@connection.send_frame(AMQ::Protocol::Tx::Select.encode(@id))
|
1277
|
-
Bunny::
|
1254
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1278
1255
|
@last_tx_select_ok = wait_on_continuations
|
1279
1256
|
end
|
1280
1257
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1289,7 +1266,7 @@ module Bunny
|
|
1289
1266
|
raise_if_no_longer_open!
|
1290
1267
|
|
1291
1268
|
@connection.send_frame(AMQ::Protocol::Tx::Commit.encode(@id))
|
1292
|
-
Bunny::
|
1269
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1293
1270
|
@last_tx_commit_ok = wait_on_continuations
|
1294
1271
|
end
|
1295
1272
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1304,7 +1281,7 @@ module Bunny
|
|
1304
1281
|
raise_if_no_longer_open!
|
1305
1282
|
|
1306
1283
|
@connection.send_frame(AMQ::Protocol::Tx::Rollback.encode(@id))
|
1307
|
-
Bunny::
|
1284
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1308
1285
|
@last_tx_rollback_ok = wait_on_continuations
|
1309
1286
|
end
|
1310
1287
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1344,7 +1321,7 @@ module Bunny
|
|
1344
1321
|
@confirms_callback = callback
|
1345
1322
|
|
1346
1323
|
@connection.send_frame(AMQ::Protocol::Confirm::Select.encode(@id, false))
|
1347
|
-
Bunny::
|
1324
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
1348
1325
|
@last_confirm_select_ok = wait_on_continuations
|
1349
1326
|
end
|
1350
1327
|
raise_if_continuation_resulted_in_a_channel_error!
|
@@ -1421,7 +1398,6 @@ module Bunny
|
|
1421
1398
|
# this includes recovering bindings
|
1422
1399
|
recover_queues
|
1423
1400
|
recover_consumers
|
1424
|
-
increment_recoveries_counter
|
1425
1401
|
end
|
1426
1402
|
|
1427
1403
|
# Recovers basic.qos setting. Used by the Automatic Network Failure
|
@@ -1467,11 +1443,6 @@ module Bunny
|
|
1467
1443
|
end
|
1468
1444
|
end
|
1469
1445
|
|
1470
|
-
# @private
|
1471
|
-
def increment_recoveries_counter
|
1472
|
-
@recoveries_counter.increment
|
1473
|
-
end
|
1474
|
-
|
1475
1446
|
# @endgroup
|
1476
1447
|
|
1477
1448
|
|
@@ -1540,17 +1511,10 @@ module Bunny
|
|
1540
1511
|
@continuations.push(method)
|
1541
1512
|
when AMQ::Protocol::Basic::Cancel then
|
1542
1513
|
if consumer = @consumers[method.consumer_tag]
|
1543
|
-
|
1544
|
-
begin
|
1545
|
-
@consumers.delete(method.consumer_tag)
|
1546
|
-
consumer.handle_cancellation(method)
|
1547
|
-
rescue Exception => e
|
1548
|
-
@logger.error "Got excepton when notifying consumer #{method.consumer_tag} about cancellation!"
|
1549
|
-
end
|
1550
|
-
end
|
1551
|
-
else
|
1552
|
-
@logger.warn "No consumer for tag #{method.consumer_tag} on channel #{@id}!"
|
1514
|
+
consumer.handle_cancellation(method)
|
1553
1515
|
end
|
1516
|
+
|
1517
|
+
@consumers.delete(method.consumer_tag)
|
1554
1518
|
when AMQ::Protocol::Basic::CancelOk then
|
1555
1519
|
@continuations.push(method)
|
1556
1520
|
unregister_consumer(method.consumer_tag)
|
@@ -1590,7 +1554,6 @@ module Bunny
|
|
1590
1554
|
|
1591
1555
|
# @private
|
1592
1556
|
def handle_basic_get_ok(basic_get_ok, properties, content)
|
1593
|
-
basic_get_ok.delivery_tag = VersionedDeliveryTag.new(basic_get_ok.delivery_tag, @recoveries_counter.get)
|
1594
1557
|
@basic_get_continuations.push([basic_get_ok, properties, content])
|
1595
1558
|
end
|
1596
1559
|
|
@@ -1642,8 +1605,10 @@ module Bunny
|
|
1642
1605
|
|
1643
1606
|
@unconfirmed_set_mutex.synchronize do
|
1644
1607
|
@only_acks_received = (@only_acks_received && !nack)
|
1608
|
+
@logger.debug "Channel #{@id}: @only_acks_received = #{@only_acks_received.inspect}, nack: #{nack.inspect}"
|
1645
1609
|
|
1646
1610
|
@confirms_continuations.push(true) if @unconfirmed_set.empty?
|
1611
|
+
|
1647
1612
|
@confirms_callback.call(delivery_tag, multiple, nack) if @confirms_callback
|
1648
1613
|
end
|
1649
1614
|
end
|
@@ -1820,19 +1785,6 @@ module Bunny
|
|
1820
1785
|
raise ChannelAlreadyClosed.new("cannot use a channel that was already closed! Channel id: #{@id}", self) if closed?
|
1821
1786
|
end
|
1822
1787
|
|
1823
|
-
# @private
|
1824
|
-
def raise_if_channel_close!(method)
|
1825
|
-
if method && method.is_a?(AMQ::Protocol::Channel::Close)
|
1826
|
-
# basic.ack, basic.reject, basic.nack. MK.
|
1827
|
-
if channel_level_exception_after_operation_that_has_no_response?(method)
|
1828
|
-
@on_error.call(self, method) if @on_error
|
1829
|
-
else
|
1830
|
-
@last_channel_error = instantiate_channel_level_exception(method)
|
1831
|
-
raise @last_channel_error
|
1832
|
-
end
|
1833
|
-
end
|
1834
|
-
end
|
1835
|
-
|
1836
1788
|
# @private
|
1837
1789
|
def reset_continuations
|
1838
1790
|
@continuations = new_continuation
|
@@ -1852,21 +1804,5 @@ module Bunny
|
|
1852
1804
|
Concurrent::ContinuationQueue.new
|
1853
1805
|
end
|
1854
1806
|
end # if defined?
|
1855
|
-
|
1856
|
-
# @private
|
1857
|
-
def guarding_against_stale_delivery_tags(tag, &block)
|
1858
|
-
case tag
|
1859
|
-
# if a fixnum was passed, execute unconditionally. MK.
|
1860
|
-
when Fixnum then
|
1861
|
-
block.call
|
1862
|
-
# versioned delivery tags should be checked to avoid
|
1863
|
-
# sending out stale (invalid) tags after channel was reopened
|
1864
|
-
# during network failure recovery. MK.
|
1865
|
-
when VersionedDeliveryTag then
|
1866
|
-
if !tag.stale?(@recoveries_counter.get)
|
1867
|
-
block.call
|
1868
|
-
end
|
1869
|
-
end
|
1870
|
-
end
|
1871
1807
|
end # Channel
|
1872
1808
|
end # Bunny
|