bunny 0.9.7 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7580b7ff949410f73fe0dd0d4425d19dd0b8b911
4
- data.tar.gz: a6121f81e944a8765cb20ad27c2f2c9aecc38009
3
+ metadata.gz: de36b24ae58dc0288bf7f25d55c84d4fca21488b
4
+ data.tar.gz: eab9a6c204683443887320e9f54a29cc46c9b795
5
5
  SHA512:
6
- metadata.gz: a773f870cdaaec57396812d6120a10052e74468f939f9f587d807755330ac21940248e6166fd46c710969dff365e23eb927bac3cad95fc25e6c07fa66cf8e04a
7
- data.tar.gz: 75a2d552c4748e98424f8ce156eb37465550329ffe078184ecdf7103132ce9c8fedf615c8b8048491af018f3ceea2ec4b5f8399107b2e28a427fc544f8175630
6
+ metadata.gz: 2d4f79815730c98bc8df51ac8c5b0f14c1040d29d4ccf8b9dae8ded2bee0b43275364fdba63fbee6c4ef7f108ae2a6f80b269aa67b07021cedb90b5addfc0f24
7
+ data.tar.gz: 3790273b80d26a6ef6c910c59dc8d38a15e2c7d8bba9f5840598e77215e923b0d2418972acbb79ed2cfb52a0c0191700738ced4dc2923047afca9c4b387e2510
@@ -1,3 +1,11 @@
1
+ ## Changes between Bunny 0.9.7 and 0.9.8
2
+
3
+ ### Exclusivity Violation for Consumers Now Raises a Reasonable Exception
4
+
5
+ When a second consumer is registered for the same queue on different channels,
6
+ a reasonable exception (`Bunny::AccessRefused`) will be raised.
7
+
8
+
1
9
  ## Changes between Bunny 0.9.6 and 0.9.7
2
10
 
3
11
  ### Reentrant Mutex Implementation
@@ -522,13 +522,13 @@ module Bunny
522
522
  end
523
523
 
524
524
  m = AMQ::Protocol::Basic::Publish.encode(@id,
525
- payload,
526
- meta,
527
- exchange_name,
528
- routing_key,
529
- meta[:mandatory],
530
- false,
531
- @connection.frame_max)
525
+ payload,
526
+ meta,
527
+ exchange_name,
528
+ routing_key,
529
+ meta[:mandatory],
530
+ false,
531
+ @connection.frame_max)
532
532
  @connection.send_frameset_without_timeout(m, self)
533
533
 
534
534
  self
@@ -765,9 +765,9 @@ module Bunny
765
765
  def basic_nack(delivery_tag, multiple = false, requeue = false)
766
766
  raise_if_no_longer_open!
767
767
  @connection.send_frame(AMQ::Protocol::Basic::Nack.encode(@id,
768
- delivery_tag,
769
- multiple,
770
- requeue))
768
+ delivery_tag,
769
+ multiple,
770
+ requeue))
771
771
 
772
772
  nil
773
773
  end
@@ -802,13 +802,13 @@ module Bunny
802
802
  end
803
803
 
804
804
  @connection.send_frame(AMQ::Protocol::Basic::Consume.encode(@id,
805
- queue_name,
806
- consumer_tag,
807
- false,
808
- no_ack,
809
- exclusive,
810
- false,
811
- arguments))
805
+ queue_name,
806
+ consumer_tag,
807
+ false,
808
+ no_ack,
809
+ exclusive,
810
+ false,
811
+ arguments))
812
812
 
813
813
  begin
814
814
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
@@ -822,6 +822,10 @@ module Bunny
822
822
  raise e
823
823
  end
824
824
 
825
+ # in case there is another exclusive consumer and we get a channel.close
826
+ # response here. MK.
827
+ raise_if_channel_close!(@last_basic_consume_ok)
828
+
825
829
  # covers server-generated consumer tags
826
830
  add_consumer(queue_name, @last_basic_consume_ok.consumer_tag, no_ack, exclusive, arguments, &block)
827
831
 
@@ -847,13 +851,13 @@ module Bunny
847
851
  end
848
852
 
849
853
  @connection.send_frame(AMQ::Protocol::Basic::Consume.encode(@id,
850
- consumer.queue_name,
851
- consumer.consumer_tag,
852
- false,
853
- consumer.no_ack,
854
- consumer.exclusive,
855
- false,
856
- consumer.arguments))
854
+ consumer.queue_name,
855
+ consumer.consumer_tag,
856
+ false,
857
+ consumer.no_ack,
858
+ consumer.exclusive,
859
+ false,
860
+ consumer.arguments))
857
861
 
858
862
  begin
859
863
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
@@ -867,6 +871,10 @@ module Bunny
867
871
  raise e
868
872
  end
869
873
 
874
+ # in case there is another exclusive consumer and we get a channel.close
875
+ # response here. MK.
876
+ raise_if_channel_close!(@last_basic_consume_ok)
877
+
870
878
  # covers server-generated consumer tags
871
879
  register_consumer(@last_basic_consume_ok.consumer_tag, consumer)
872
880
 
@@ -927,13 +935,13 @@ module Bunny
927
935
  raise_if_no_longer_open!
928
936
 
929
937
  @connection.send_frame(AMQ::Protocol::Queue::Declare.encode(@id,
930
- name,
931
- opts.fetch(:passive, false),
932
- opts.fetch(:durable, false),
933
- opts.fetch(:exclusive, false),
934
- opts.fetch(:auto_delete, false),
935
- false,
936
- opts[:arguments]))
938
+ name,
939
+ opts.fetch(:passive, false),
940
+ opts.fetch(:durable, false),
941
+ opts.fetch(:exclusive, false),
942
+ opts.fetch(:auto_delete, false),
943
+ false,
944
+ opts[:arguments]))
937
945
  @last_queue_declare_ok = wait_on_continuations
938
946
 
939
947
  raise_if_continuation_resulted_in_a_channel_error!
@@ -956,10 +964,10 @@ module Bunny
956
964
  raise_if_no_longer_open!
957
965
 
958
966
  @connection.send_frame(AMQ::Protocol::Queue::Delete.encode(@id,
959
- name,
960
- opts[:if_unused],
961
- opts[:if_empty],
962
- false))
967
+ name,
968
+ opts[:if_unused],
969
+ opts[:if_empty],
970
+ false))
963
971
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
964
972
  @last_queue_delete_ok = wait_on_continuations
965
973
  end
@@ -1011,11 +1019,11 @@ module Bunny
1011
1019
  end
1012
1020
 
1013
1021
  @connection.send_frame(AMQ::Protocol::Queue::Bind.encode(@id,
1014
- name,
1015
- exchange_name,
1016
- opts[:routing_key],
1017
- false,
1018
- opts[:arguments]))
1022
+ name,
1023
+ exchange_name,
1024
+ opts[:routing_key],
1025
+ false,
1026
+ opts[:arguments]))
1019
1027
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
1020
1028
  @last_queue_bind_ok = wait_on_continuations
1021
1029
  end
@@ -1047,10 +1055,10 @@ module Bunny
1047
1055
  end
1048
1056
 
1049
1057
  @connection.send_frame(AMQ::Protocol::Queue::Unbind.encode(@id,
1050
- name,
1051
- exchange_name,
1052
- opts[:routing_key],
1053
- opts[:arguments]))
1058
+ name,
1059
+ exchange_name,
1060
+ opts[:routing_key],
1061
+ opts[:arguments]))
1054
1062
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
1055
1063
  @last_queue_unbind_ok = wait_on_continuations
1056
1064
  end
@@ -1082,14 +1090,14 @@ module Bunny
1082
1090
  raise_if_no_longer_open!
1083
1091
 
1084
1092
  @connection.send_frame(AMQ::Protocol::Exchange::Declare.encode(@id,
1085
- name,
1086
- type.to_s,
1087
- opts.fetch(:passive, false),
1088
- opts.fetch(:durable, false),
1089
- opts.fetch(:auto_delete, false),
1090
- false,
1091
- false,
1092
- opts[:arguments]))
1093
+ name,
1094
+ type.to_s,
1095
+ opts.fetch(:passive, false),
1096
+ opts.fetch(:durable, false),
1097
+ opts.fetch(:auto_delete, false),
1098
+ false,
1099
+ false,
1100
+ opts[:arguments]))
1093
1101
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
1094
1102
  @last_exchange_declare_ok = wait_on_continuations
1095
1103
  end
@@ -1112,9 +1120,9 @@ module Bunny
1112
1120
  raise_if_no_longer_open!
1113
1121
 
1114
1122
  @connection.send_frame(AMQ::Protocol::Exchange::Delete.encode(@id,
1115
- name,
1116
- opts[:if_unused],
1117
- false))
1123
+ name,
1124
+ opts[:if_unused],
1125
+ false))
1118
1126
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
1119
1127
  @last_exchange_delete_ok = wait_on_continuations
1120
1128
  end
@@ -1154,11 +1162,11 @@ module Bunny
1154
1162
  end
1155
1163
 
1156
1164
  @connection.send_frame(AMQ::Protocol::Exchange::Bind.encode(@id,
1157
- destination_name,
1158
- source_name,
1159
- opts[:routing_key],
1160
- false,
1161
- opts[:arguments]))
1165
+ destination_name,
1166
+ source_name,
1167
+ opts[:routing_key],
1168
+ false,
1169
+ opts[:arguments]))
1162
1170
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
1163
1171
  @last_exchange_bind_ok = wait_on_continuations
1164
1172
  end
@@ -1198,11 +1206,11 @@ module Bunny
1198
1206
  end
1199
1207
 
1200
1208
  @connection.send_frame(AMQ::Protocol::Exchange::Unbind.encode(@id,
1201
- destination_name,
1202
- source_name,
1203
- opts[:routing_key],
1204
- false,
1205
- opts[:arguments]))
1209
+ destination_name,
1210
+ source_name,
1211
+ opts[:routing_key],
1212
+ false,
1213
+ opts[:arguments]))
1206
1214
  Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
1207
1215
  @last_exchange_unbind_ok = wait_on_continuations
1208
1216
  end
@@ -1786,6 +1794,19 @@ module Bunny
1786
1794
  raise ChannelAlreadyClosed.new("cannot use a channel that was already closed! Channel id: #{@id}", self) if closed?
1787
1795
  end
1788
1796
 
1797
+ # @private
1798
+ def raise_if_channel_close!(method)
1799
+ if method && method.is_a?(AMQ::Protocol::Channel::Close)
1800
+ # basic.ack, basic.reject, basic.nack. MK.
1801
+ if channel_level_exception_after_operation_that_has_no_response?(method)
1802
+ @on_error.call(self, method) if @on_error
1803
+ else
1804
+ @last_channel_error = instantiate_channel_level_exception(method)
1805
+ raise @last_channel_error
1806
+ end
1807
+ end
1808
+ end
1809
+
1789
1810
  # @private
1790
1811
  def reset_continuations
1791
1812
  @continuations = new_continuation
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bunny
4
4
  # @return [String] Version of the library
5
- VERSION = "0.9.7"
5
+ VERSION = "0.9.8"
6
6
  end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe "Registering 2nd exclusive consumer on queue" do
4
+ let(:connection) do
5
+ c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
+ c.start
7
+ c
8
+ end
9
+
10
+ after :each do
11
+ connection.close if connection.open?
12
+ end
13
+
14
+
15
+ it "raises a meaningful exception" do
16
+ xs = []
17
+
18
+ ch1 = connection.create_channel
19
+ ch2 = connection.create_channel
20
+ q1 = ch1.queue("", :auto_delete => true)
21
+ q2 = ch2.queue(q1.name, :auto_delete => true, :passive => true)
22
+
23
+ c1 = q1.subscribe(:exclusive => true) do |_, _, payload|
24
+ xs << payload
25
+ end
26
+ sleep 0.1
27
+
28
+ lambda do
29
+ q2.subscribe(:exclusive => true) do |_, _, _|
30
+ end
31
+ end.should raise_error(Bunny::AccessRefused)
32
+
33
+ ch1.should be_open
34
+ ch2.should be_closed
35
+
36
+ q1.publish("abc")
37
+ sleep 0.1
38
+
39
+ # verify that the first consumer is fine
40
+ xs.should == ["abc"]
41
+
42
+ q1.delete
43
+ end
44
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunny
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 0.9.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Duncan
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-07-26 00:00:00.000000000 Z
15
+ date: 2013-07-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: amq-protocol
@@ -162,6 +162,7 @@ files:
162
162
  - spec/higher_level_api/integration/tx_commit_spec.rb
163
163
  - spec/higher_level_api/integration/tx_rollback_spec.rb
164
164
  - spec/issues/issue100_spec.rb
165
+ - spec/issues/issue141_spec.rb
165
166
  - spec/issues/issue78_spec.rb
166
167
  - spec/issues/issue83_spec.rb
167
168
  - spec/issues/issue97_attachment.json
@@ -250,6 +251,7 @@ test_files:
250
251
  - spec/higher_level_api/integration/tx_commit_spec.rb
251
252
  - spec/higher_level_api/integration/tx_rollback_spec.rb
252
253
  - spec/issues/issue100_spec.rb
254
+ - spec/issues/issue141_spec.rb
253
255
  - spec/issues/issue78_spec.rb
254
256
  - spec/issues/issue83_spec.rb
255
257
  - spec/issues/issue97_attachment.json