bunny 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
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