bunny 0.7.13 → 0.8.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 (61) hide show
  1. data/.gitignore +2 -2
  2. data/.travis.yml +7 -16
  3. data/CHANGELOG +3 -21
  4. data/Gemfile +2 -4
  5. data/README.textile +31 -9
  6. data/Rakefile +3 -3
  7. data/bunny.gemspec +6 -3
  8. data/examples/{simple_08.rb → simple.rb} +1 -1
  9. data/examples/{simple_ack_08.rb → simple_ack.rb} +1 -1
  10. data/examples/{simple_consumer_08.rb → simple_consumer.rb} +4 -4
  11. data/examples/{simple_fanout_08.rb → simple_fanout.rb} +1 -1
  12. data/examples/{simple_headers_08.rb → simple_headers.rb} +2 -2
  13. data/examples/{simple_publisher_09.rb → simple_publisher.rb} +1 -1
  14. data/examples/{simple_topic_09.rb → simple_topic.rb} +2 -2
  15. data/ext/amqp-0.9.1.json +1 -0
  16. data/ext/config.yml +3 -3
  17. data/ext/qparser.rb +9 -52
  18. data/lib/bunny/{client09.rb → client.rb} +34 -46
  19. data/lib/bunny/{exchange09.rb → exchange.rb} +16 -15
  20. data/lib/bunny/{queue09.rb → queue.rb} +26 -23
  21. data/lib/bunny/{subscription09.rb → subscription.rb} +11 -6
  22. data/lib/bunny/version.rb +1 -1
  23. data/lib/bunny.rb +15 -33
  24. data/lib/qrack/client.rb +31 -22
  25. data/lib/qrack/protocol/{protocol08.rb → protocol.rb} +2 -1
  26. data/lib/qrack/protocol/{spec09.rb → spec.rb} +8 -7
  27. data/lib/qrack/{qrack08.rb → qrack.rb} +4 -4
  28. data/lib/qrack/subscription.rb +58 -9
  29. data/lib/qrack/transport/{buffer08.rb → buffer.rb} +9 -1
  30. data/lib/qrack/transport/{frame08.rb → frame.rb} +7 -22
  31. data/spec/spec_09/amqp_url_spec.rb +1 -1
  32. data/spec/spec_09/bunny_spec.rb +11 -9
  33. data/spec/spec_09/connection_spec.rb +9 -4
  34. data/spec/spec_09/exchange_spec.rb +23 -25
  35. data/spec/spec_09/queue_spec.rb +33 -19
  36. metadata +71 -81
  37. checksums.yaml +0 -7
  38. data/examples/simple_09.rb +0 -32
  39. data/examples/simple_ack_09.rb +0 -35
  40. data/examples/simple_consumer_09.rb +0 -55
  41. data/examples/simple_fanout_09.rb +0 -41
  42. data/examples/simple_headers_09.rb +0 -42
  43. data/examples/simple_publisher_08.rb +0 -29
  44. data/examples/simple_topic_08.rb +0 -61
  45. data/ext/amqp-0.8.json +0 -616
  46. data/lib/bunny/channel09.rb +0 -39
  47. data/lib/bunny/client08.rb +0 -480
  48. data/lib/bunny/exchange08.rb +0 -177
  49. data/lib/bunny/queue08.rb +0 -403
  50. data/lib/bunny/subscription08.rb +0 -87
  51. data/lib/qrack/protocol/protocol09.rb +0 -135
  52. data/lib/qrack/protocol/spec08.rb +0 -828
  53. data/lib/qrack/qrack09.rb +0 -20
  54. data/lib/qrack/transport/buffer09.rb +0 -305
  55. data/lib/qrack/transport/frame09.rb +0 -97
  56. data/spec/spec_08/bunny_spec.rb +0 -75
  57. data/spec/spec_08/connection_spec.rb +0 -24
  58. data/spec/spec_08/exchange_spec.rb +0 -175
  59. data/spec/spec_08/queue_spec.rb +0 -239
  60. data/spec/spec_helper.rb +0 -8
  61. /data/lib/bunny/{channel08.rb → channel.rb} +0 -0
@@ -3,7 +3,7 @@
3
3
  module Bunny
4
4
 
5
5
  # The Client class provides the major Bunny API methods.
6
- class Client09 < Qrack::Client
6
+ class Client < Qrack::Client
7
7
 
8
8
  # Sets up a Bunny::Client object ready for connection to a broker.
9
9
  # {Client.status} is set to @:not_connected@.
@@ -32,20 +32,20 @@ module Bunny
32
32
  # Number of seconds before {Qrack::ConnectionTimeout} is raised.@
33
33
  def initialize(connection_string_or_opts = Hash.new, opts = Hash.new)
34
34
  super
35
- @spec = '0-9-1'
36
- @port = self.__opts__[:port] || (self.__opts__[:ssl] ? Qrack::Protocol09::SSL_PORT : Qrack::Protocol09::PORT)
37
35
  end
38
36
 
39
37
  # Checks response from AMQP methods and takes appropriate action
40
38
  def check_response(received_method, expected_method, err_msg, err_class = Bunny::ProtocolError)
39
+ @last_method = received_method
40
+
41
41
  case
42
- when received_method.is_a?(Qrack::Protocol09::Connection::Close)
42
+ when received_method.is_a?(Qrack::Protocol::Connection::Close)
43
43
  # Clean up the socket
44
44
  close_socket
45
45
 
46
46
  raise Bunny::ForcedConnectionCloseError, "Error Reply Code: #{received_method.reply_code}\nError Reply Text: #{received_method.reply_text}"
47
47
 
48
- when received_method.is_a?(Qrack::Protocol09::Channel::Close)
48
+ when received_method.is_a?(Qrack::Protocol::Channel::Close)
49
49
  # Clean up the channel
50
50
  channel.active = false
51
51
 
@@ -63,11 +63,11 @@ module Bunny
63
63
  # Set client channel to zero
64
64
  switch_channel(0)
65
65
 
66
- send_frame(Qrack::Protocol09::Connection::Close.new(:reply_code => 200, :reply_text => 'Goodbye', :class_id => 0, :method_id => 0))
66
+ send_frame(Qrack::Protocol::Connection::Close.new(:reply_code => 200, :reply_text => 'Goodbye', :class_id => 0, :method_id => 0))
67
67
 
68
68
  method = next_method
69
69
 
70
- check_response(method, Qrack::Protocol09::Connection::CloseOk, "Error closing connection")
70
+ check_response(method, Qrack::Protocol::Connection::CloseOk, "Error closing connection")
71
71
 
72
72
  end
73
73
 
@@ -76,7 +76,7 @@ module Bunny
76
76
  return c if (!c.open? and c.number != 0)
77
77
  end
78
78
  # If no channel to re-use instantiate new one
79
- Bunny::Channel09.new(self)
79
+ Bunny::Channel.new(self)
80
80
  end
81
81
 
82
82
  # Declares an exchange to the broker/server. If the exchange does not exist, a new one is created
@@ -103,17 +103,17 @@ module Bunny
103
103
  # @option opts [Boolean] :nowait (false)
104
104
  # Ignored by Bunny, always @false@.
105
105
  #
106
- # @return [Bunny::Exchange09]
106
+ # @return [Bunny::Exchange]
107
107
  def exchange(name, opts = {})
108
- exchanges[name] || Bunny::Exchange09.new(self, name, opts)
108
+ exchanges[name] || Bunny::Exchange.new(self, name, opts)
109
109
  end
110
110
 
111
111
  def init_connection
112
- write(Qrack::Protocol09::HEADER)
113
- write([0, Qrack::Protocol09::VERSION_MAJOR, Qrack::Protocol09::VERSION_MINOR, Qrack::Protocol09::REVISION].pack('C4'))
112
+ write(Qrack::Protocol::HEADER)
113
+ write([0, Qrack::Protocol::VERSION_MAJOR, Qrack::Protocol::VERSION_MINOR, Qrack::Protocol::REVISION].pack('C4'))
114
114
 
115
115
  frame = next_frame
116
- if frame.nil? or !frame.payload.is_a?(Qrack::Protocol09::Connection::Start)
116
+ if frame.nil? or !frame.payload.is_a?(Qrack::Protocol::Connection::Start)
117
117
  raise Bunny::ProtocolError, 'Connection initiation failed'
118
118
  end
119
119
  end
@@ -124,12 +124,8 @@ module Bunny
124
124
  case
125
125
  when channel.frame_buffer.size > 0
126
126
  frame = channel.frame_buffer.shift
127
- when (timeout = opts[:timeout]) && timeout > 0
128
- Bunny::Timer::timeout(timeout, Qrack::FrameTimeout) do
129
- frame = Qrack::Transport09::Frame.parse(buffer)
130
- end
131
127
  else
132
- frame = Qrack::Transport09::Frame.parse(buffer)
128
+ frame = Qrack::Transport::Frame.parse(buffer, opts)
133
129
  end
134
130
 
135
131
  @logger.info("received") { frame } if @logging
@@ -140,7 +136,7 @@ module Bunny
140
136
  @message_in = true
141
137
 
142
138
  case
143
- when frame.is_a?(Qrack::Transport09::Heartbeat)
139
+ when frame.is_a?(Qrack::Transport::Heartbeat)
144
140
  next_frame(opts)
145
141
  when frame.nil?
146
142
  frame
@@ -161,22 +157,20 @@ module Bunny
161
157
  :response => "\0" + @user + "\0" + @pass,
162
158
  :locale => 'en_US'
163
159
  }
164
- send_frame(Qrack::Protocol09::Connection::StartOk.new(start_opts))
160
+ send_frame(Qrack::Protocol::Connection::StartOk.new(start_opts))
165
161
 
166
162
  frame = next_frame
167
163
  raise Bunny::ProtocolError, "Connection failed - user: #{@user}" if frame.nil?
168
164
 
169
165
  method = frame.payload
170
166
 
171
- if method.is_a?(Qrack::Protocol09::Connection::Tune)
172
- @frame_max = method.frame_max if method.frame_max > 0 && method.frame_max < @frame_max
173
- @channel_max = method.channel_max if method.channel_max > 0 && method.channel_max < @channel_max
174
- send_frame(Qrack::Protocol09::Connection::TuneOk.new(:channel_max => @channel_max, :frame_max => @frame_max, :heartbeat => @heartbeat))
167
+ if method.is_a?(Qrack::Protocol::Connection::Tune)
168
+ send_frame(Qrack::Protocol::Connection::TuneOk.new(:channel_max => @channel_max, :frame_max => @frame_max, :heartbeat => @heartbeat))
175
169
  end
176
170
 
177
- send_frame(Qrack::Protocol09::Connection::Open.new(:virtual_host => @vhost, :reserved_1 => 0, :reserved_2 => false))
171
+ send_frame(Qrack::Protocol::Connection::Open.new(:virtual_host => @vhost, :reserved_1 => 0, :reserved_2 => false))
178
172
 
179
- raise Bunny::ProtocolError, 'Cannot open connection' unless next_method.is_a?(Qrack::Protocol09::Connection::OpenOk)
173
+ raise Bunny::ProtocolError, 'Cannot open connection' unless next_method.is_a?(Qrack::Protocol::Connection::OpenOk)
180
174
  end
181
175
 
182
176
  # Requests a specific quality of service. The QoS can be specified for the current channel
@@ -206,11 +200,11 @@ module Bunny
206
200
  #
207
201
  # @return [Symbol] @:qos_ok@ if successful.
208
202
  def qos(opts = {})
209
- send_frame(Qrack::Protocol09::Basic::Qos.new({ :prefetch_size => 0, :prefetch_count => 1, :global => false }.merge(opts)))
203
+ send_frame(Qrack::Protocol::Basic::Qos.new({ :prefetch_size => 0, :prefetch_count => 1, :global => false }.merge(opts)))
210
204
 
211
205
  method = next_method
212
206
 
213
- check_response(method, Qrack::Protocol09::Basic::QosOk, "Error specifying Quality of Service")
207
+ check_response(method, Qrack::Protocol::Basic::QosOk, "Error specifying Quality of Service")
214
208
 
215
209
  # return confirmation
216
210
  :qos_ok
@@ -244,7 +238,7 @@ module Bunny
244
238
  # @option opts [Boolean] :nowait (false)
245
239
  # Ignored by Bunny, always @false@.
246
240
  #
247
- # @return [Bunny::Queue09]
241
+ # @return [Bunny::Queue]
248
242
  def queue(name = nil, opts = {})
249
243
  if name.is_a?(Hash)
250
244
  opts = name
@@ -252,7 +246,7 @@ module Bunny
252
246
  end
253
247
 
254
248
  # Queue is responsible for placing itself in the list of queues
255
- queues[name] || Bunny::Queue09.new(self, name, opts)
249
+ queues[name] || Bunny::Queue.new(self, name, opts)
256
250
  end
257
251
 
258
252
  # Asks the broker to redeliver all unacknowledged messages on a specified channel. Zero or
@@ -263,12 +257,12 @@ module Bunny
263
257
  # If set to @true@, the server will attempt to requeue the message, potentially
264
258
  # then delivering it to an alternative subscriber.
265
259
  def recover(opts = {})
266
- send_frame(Qrack::Protocol09::Basic::Recover.new({ :requeue => false }.merge(opts)))
260
+ send_frame(Qrack::Protocol::Basic::Recover.new({ :requeue => false }.merge(opts)))
267
261
  end
268
262
 
269
263
  def send_frame(*args)
270
264
  args.each do |data|
271
- data = data.to_frame(channel.number) unless data.is_a?(Qrack::Transport09::Frame)
265
+ data = data.to_frame(channel.number) unless data.is_a?(Qrack::Transport::Frame)
272
266
  data.channel = channel.number
273
267
 
274
268
  @logger.info("send") { data } if @logging
@@ -283,7 +277,7 @@ module Bunny
283
277
 
284
278
  def send_heartbeat
285
279
  # Create a new heartbeat frame
286
- hb = Qrack::Transport09::Heartbeat.new('')
280
+ hb = Qrack::Transport::Heartbeat.new('')
287
281
  # Channel 0 must be used
288
282
  switch_channel(0) if @channel.number > 0
289
283
  # Send the heartbeat to server
@@ -324,11 +318,11 @@ module Bunny
324
318
  #
325
319
  # @return [Symbol] @:commit_ok@ if successful.
326
320
  def tx_commit
327
- send_frame(Qrack::Protocol09::Tx::Commit.new())
321
+ send_frame(Qrack::Protocol::Tx::Commit.new())
328
322
 
329
323
  method = next_method
330
324
 
331
- check_response(method, Qrack::Protocol09::Tx::CommitOk, "Error commiting transaction")
325
+ check_response(method, Qrack::Protocol::Tx::CommitOk, "Error commiting transaction")
332
326
 
333
327
  # return confirmation
334
328
  :commit_ok
@@ -340,11 +334,11 @@ module Bunny
340
334
  #
341
335
  # @return [Symbol] @:rollback_ok@ if successful.
342
336
  def tx_rollback
343
- send_frame(Qrack::Protocol09::Tx::Rollback.new())
337
+ send_frame(Qrack::Protocol::Tx::Rollback.new())
344
338
 
345
339
  method = next_method
346
340
 
347
- check_response(method, Qrack::Protocol09::Tx::RollbackOk, "Error rolling back transaction")
341
+ check_response(method, Qrack::Protocol::Tx::RollbackOk, "Error rolling back transaction")
348
342
 
349
343
  # return confirmation
350
344
  :rollback_ok
@@ -356,26 +350,20 @@ module Bunny
356
350
  #
357
351
  # @return [Symbol] @:select_ok@ if successful.
358
352
  def tx_select
359
- send_frame(Qrack::Protocol09::Tx::Select.new())
353
+ send_frame(Qrack::Protocol::Tx::Select.new())
360
354
 
361
355
  method = next_method
362
356
 
363
- check_response(method, Qrack::Protocol09::Tx::SelectOk, "Error initiating transactions for current channel")
357
+ check_response(method, Qrack::Protocol::Tx::SelectOk, "Error initiating transactions for current channel")
364
358
 
365
359
  # return confirmation
366
360
  :select_ok
367
361
  end
368
362
 
369
- protected
370
-
371
- def check_returned_message(method)
372
- check_response(method, Qrack::Protocol09::Basic::Return, "Expected a returned message")
373
- end
374
-
375
363
  private
376
364
 
377
365
  def buffer
378
- @buffer ||= Qrack::Transport09::Buffer.new(self)
366
+ @buffer ||= Qrack::Transport::Buffer.new(self)
379
367
  end
380
368
 
381
369
  end
@@ -24,7 +24,7 @@ module Bunny
24
24
  # If you want more information about exchanges, please consult the documentation for your
25
25
  # target broker/server or visit the "AMQP website":http://www.amqp.org to find the version of the
26
26
  # specification that applies to your target broker/server.
27
- class Exchange09
27
+ class Exchange
28
28
 
29
29
  attr_reader :client, :type, :name, :opts, :key
30
30
 
@@ -58,11 +58,11 @@ module Bunny
58
58
  :deprecated_ticket => 0, :deprecated_auto_delete => false, :deprecated_internal => false
59
59
  }.merge(opts)
60
60
 
61
- client.send_frame(Qrack::Protocol09::Exchange::Declare.new(opts))
61
+ client.send_frame(Qrack::Protocol::Exchange::Declare.new(opts))
62
62
 
63
63
  method = client.next_method
64
64
 
65
- client.check_response(method, Qrack::Protocol09::Exchange::DeclareOk, "Error declaring exchange #{name}: type = #{type}")
65
+ client.check_response(method, Qrack::Protocol::Exchange::DeclareOk, "Error declaring exchange #{name}: type = #{type}")
66
66
  end
67
67
  end
68
68
 
@@ -83,11 +83,11 @@ module Bunny
83
83
 
84
84
  opts = { :exchange => name, :nowait => false, :deprecated_ticket => 0 }.merge(opts)
85
85
 
86
- client.send_frame(Qrack::Protocol09::Exchange::Delete.new(opts))
86
+ client.send_frame(Qrack::Protocol::Exchange::Delete.new(opts))
87
87
 
88
88
  method = client.next_method
89
89
 
90
- client.check_response(method, Qrack::Protocol09::Exchange::DeleteOk, "Error deleting exchange #{name}")
90
+ client.check_response(method, Qrack::Protocol::Exchange::DeleteOk, "Error deleting exchange #{name}")
91
91
 
92
92
  client.exchanges.delete(name)
93
93
 
@@ -128,34 +128,35 @@ module Bunny
128
128
  opts = opts.dup
129
129
  out = []
130
130
 
131
+
131
132
  # Set up options
132
133
  routing_key = opts.delete(:key) || key
133
134
  mandatory = opts.delete(:mandatory)
134
135
  immediate = opts.delete(:immediate)
135
136
  delivery_mode = opts.delete(:persistent) ? 2 : 1
136
137
  content_type = opts.delete(:content_type) || 'application/octet-stream'
138
+ reply_to = opts.delete(:reply_to)
139
+ correlation_id = opts.delete(:correlation_id)
140
+ user_id = opts.delete(:user_id)
137
141
 
138
- out << Qrack::Protocol09::Basic::Publish.new({ :exchange => name,
142
+ out << Qrack::Protocol::Basic::Publish.new({ :exchange => name,
139
143
  :routing_key => routing_key,
140
144
  :mandatory => mandatory,
141
145
  :immediate => immediate,
142
146
  :deprecated_ticket => 0 })
143
147
  data = data.to_s
144
- out << Qrack::Protocol09::Header.new(
145
- Qrack::Protocol09::Basic,
148
+ out << Qrack::Protocol::Header.new(
149
+ Qrack::Protocol::Basic,
146
150
  data.bytesize, {
147
151
  :content_type => content_type,
148
152
  :delivery_mode => delivery_mode,
153
+ :reply_to => reply_to,
154
+ :correlation_id => correlation_id,
155
+ :user_id => user_id,
149
156
  :priority => 0
150
157
  }.merge(opts)
151
158
  )
152
-
153
- limit = @client.frame_max - 8
154
- i = 0
155
- while i < data.bytesize
156
- out << Qrack::Transport09::Body.new(data.byteslice(i, limit))
157
- i += limit
158
- end
159
+ out << Qrack::Transport::Body.new(data)
159
160
 
160
161
  client.send_frame(*out)
161
162
  end
@@ -4,7 +4,7 @@ module Bunny
4
4
 
5
5
  # Queues store and forward messages. Queues can be configured in the server or created at runtime.
6
6
  # Queues must be attached to at least one exchange in order to receive messages from publishers.
7
- class Queue09 < Qrack::Queue
7
+ class Queue < Qrack::Queue
8
8
  def initialize(client, name, opts = {})
9
9
  # check connection to server
10
10
  raise Bunny::ConnectionError, 'Not connected to server' if client.status == :not_connected
@@ -31,11 +31,11 @@ module Bunny
31
31
 
32
32
  opts = { :queue => name || '', :nowait => false, :deprecated_ticket => 0 }.merge(opts)
33
33
 
34
- client.send_frame(Qrack::Protocol09::Queue::Declare.new(opts))
34
+ client.send_frame(Qrack::Protocol::Queue::Declare.new(opts))
35
35
 
36
36
  method = client.next_method
37
37
 
38
- client.check_response(method, Qrack::Protocol09::Queue::DeclareOk, "Error declaring queue #{name}")
38
+ client.check_response(method, Qrack::Protocol::Queue::DeclareOk, "Error declaring queue #{name}")
39
39
 
40
40
  @name = method.queue
41
41
  client.queues[@name] = self
@@ -54,7 +54,7 @@ module Bunny
54
54
  # @private
55
55
  def self.consumer_class
56
56
  # Bunny::Consumer
57
- Bunny::Subscription09
57
+ Bunny::Subscription
58
58
  end # self.consumer_class
59
59
 
60
60
  # Acknowledges one or more messages delivered via the _Deliver_ or _Get_-_Ok_ methods. The client can
@@ -78,7 +78,7 @@ module Bunny
78
78
 
79
79
  opts = {:delivery_tag => delivery_tag, :multiple => false}.merge(opts)
80
80
 
81
- client.send_frame(Qrack::Protocol09::Basic::Ack.new(opts))
81
+ client.send_frame(Qrack::Protocol::Basic::Ack.new(opts))
82
82
 
83
83
  # reset delivery tag
84
84
  self.delivery_tag = nil
@@ -111,11 +111,11 @@ module Bunny
111
111
  :deprecated_ticket => 0
112
112
  }.merge(opts)
113
113
 
114
- client.send_frame(Qrack::Protocol09::Queue::Bind.new(opts))
114
+ client.send_frame(Qrack::Protocol::Queue::Bind.new(opts))
115
115
 
116
116
  method = client.next_method
117
117
 
118
- client.check_response(method, Qrack::Protocol09::Queue::BindOk, "Error binding queue: #{name} to exchange: #{exchange}")
118
+ client.check_response(method, Qrack::Protocol::Queue::BindOk, "Error binding queue: #{name} to exchange: #{exchange}")
119
119
 
120
120
  # return message
121
121
  :bind_ok
@@ -144,11 +144,11 @@ module Bunny
144
144
 
145
145
  opts = { :queue => name, :nowait => false, :deprecated_ticket => 0 }.merge(opts)
146
146
 
147
- client.send_frame(Qrack::Protocol09::Queue::Delete.new(opts))
147
+ client.send_frame(Qrack::Protocol::Queue::Delete.new(opts))
148
148
 
149
149
  method = client.next_method
150
150
 
151
- client.check_response(method, Qrack::Protocol09::Queue::DeleteOk, "Error deleting queue #{name}")
151
+ client.check_response(method, Qrack::Protocol::Queue::DeleteOk, "Error deleting queue #{name}")
152
152
 
153
153
  client.queues.delete(name)
154
154
 
@@ -174,13 +174,13 @@ module Bunny
174
174
  :deprecated_ticket => 0
175
175
  }.merge(opts)
176
176
 
177
- client.send_frame(Qrack::Protocol09::Basic::Get.new(opts))
177
+ client.send_frame(Qrack::Protocol::Basic::Get.new(opts))
178
178
 
179
179
  method = client.next_method
180
180
 
181
- if method.is_a?(Qrack::Protocol09::Basic::GetEmpty) then
181
+ if method.is_a?(Qrack::Protocol::Basic::GetEmpty) then
182
182
  queue_empty = true
183
- elsif !method.is_a?(Qrack::Protocol09::Basic::GetOk)
183
+ elsif !method.is_a?(Qrack::Protocol::Basic::GetOk)
184
184
  raise Bunny::ProtocolError, "Error getting message from queue #{name}"
185
185
  end
186
186
 
@@ -221,11 +221,11 @@ module Bunny
221
221
 
222
222
  opts = { :queue => name, :nowait => false, :deprecated_ticket => 0 }.merge(opts)
223
223
 
224
- client.send_frame(Qrack::Protocol09::Queue::Purge.new(opts))
224
+ client.send_frame(Qrack::Protocol::Queue::Purge.new(opts))
225
225
 
226
226
  method = client.next_method
227
227
 
228
- client.check_response(method, Qrack::Protocol09::Queue::PurgeOk, "Error purging queue #{name}")
228
+ client.check_response(method, Qrack::Protocol::Queue::PurgeOk, "Error purging queue #{name}")
229
229
 
230
230
  # return confirmation
231
231
  :purge_ok
@@ -234,7 +234,7 @@ module Bunny
234
234
  # @return [Hash] Hash with keys @:message_count@ and @consumer_count@.
235
235
  def status
236
236
  opts = { :queue => name, :passive => true, :deprecated_ticket => 0 }
237
- client.send_frame(Qrack::Protocol09::Queue::Declare.new(opts))
237
+ client.send_frame(Qrack::Protocol::Queue::Declare.new(opts))
238
238
 
239
239
  method = client.next_method
240
240
  {:message_count => method.message_count, :consumer_count => method.consumer_count}
@@ -272,11 +272,11 @@ module Bunny
272
272
  :deprecated_ticket => 0
273
273
  }.merge(opts)
274
274
 
275
- client.send_frame(Qrack::Protocol09::Queue::Unbind.new(opts))
275
+ client.send_frame(Qrack::Protocol::Queue::Unbind.new(opts))
276
276
 
277
277
  method = client.next_method
278
278
 
279
- client.check_response(method, Qrack::Protocol09::Queue::UnbindOk, "Error unbinding queue #{name}")
279
+ client.check_response(method, Qrack::Protocol::Queue::UnbindOk, "Error unbinding queue #{name}")
280
280
 
281
281
  # return message
282
282
  :unbind_ok
@@ -291,6 +291,9 @@ module Bunny
291
291
  # @option opts [Boolean] :nowait (false)
292
292
  # Ignored by Bunny, always @false@.
293
293
  #
294
+ # @option opts [Boolean] :nowait (false)
295
+ # Ignored by Bunny, always @false@.
296
+ #
294
297
  # @return [Symbol] @:unsubscribe_ok@ if successful
295
298
  def unsubscribe(opts = {})
296
299
  # Default consumer_tag from subscription if not passed in
@@ -301,15 +304,15 @@ module Bunny
301
304
  "No consumer tag received" if !consumer_tag
302
305
 
303
306
  # Cancel consumer
304
- client.send_frame(Qrack::Protocol09::Basic::Cancel.new(:consumer_tag => consumer_tag, :nowait => false))
305
-
306
- method = client.next_method
307
-
308
- client.check_response(method, Qrack::Protocol09::Basic::CancelOk, "Error unsubscribing from queue #{name}")
307
+ client.send_frame(Qrack::Protocol::Basic::Cancel.new(:consumer_tag => consumer_tag, :nowait => false))
309
308
 
310
309
  # Reset subscription
311
310
  @default_consumer = nil
312
311
 
312
+ method = client.next_method
313
+
314
+ client.check_response(method, Qrack::Protocol::Basic::CancelOk, "Error unsubscribing from queue #{name}, got #{method.class}")
315
+
313
316
  # Return confirmation
314
317
  :unsubscribe_ok
315
318
  end
@@ -317,7 +320,7 @@ module Bunny
317
320
  private
318
321
 
319
322
  def exchange
320
- @exchange ||= Bunny::Exchange09.new(client, '', :type => :direct, :key => name, :reserved_1 => 0, :reserved_2 => false, :reserved_3 => false)
323
+ @exchange ||= Bunny::Exchange.new(client, '', :type => :direct, :key => name, :reserved_1 => 0, :reserved_2 => false, :reserved_3 => false)
321
324
  end
322
325
 
323
326
  end
@@ -31,6 +31,12 @@ module Bunny
31
31
  # @option opts [Integer] :message_max
32
32
  # When the required number of messages is processed subscribe loop is exited.
33
33
  #
34
+ # @option opts [IO] :cancellator (nil)
35
+ # A cancellator can be used to for cancelling the subscribe loop from another
36
+ # thread or from a signal handler. Whenever Bunny notices that this IO object has
37
+ # become readable, the subscribe loop will be exited after the current message
38
+ # has been processed.
39
+ #
34
40
  # h2. Operation
35
41
  #
36
42
  # Passes a hash of message information to the block, if one has been supplied. The hash contains
@@ -54,14 +60,13 @@ module Bunny
54
60
  # :exchange
55
61
  # :routing_key
56
62
  #
57
- # If the :timeout option is specified then the subscription will
58
- # automatically cease if the given number of seconds passes with no
59
- # message arriving.
63
+ # If the :timeout option is specified then the subscription will automatically
64
+ # cease if the given number of seconds passes with no message arriving.
60
65
  #
61
66
  # @example
62
67
  # my_queue.subscribe(timeout: 5) { |msg| puts msg[:payload] }
63
68
  # my_queue.subscribe(message_max: 10, ack: true) { |msg| puts msg[:payload] }
64
- class Subscription09 < Bunny::Consumer
69
+ class Subscription < Bunny::Consumer
65
70
 
66
71
  def setup_consumer
67
72
  subscription_options = {
@@ -73,11 +78,11 @@ module Bunny
73
78
  :nowait => false
74
79
  }.merge(@opts)
75
80
 
76
- client.send_frame(Qrack::Protocol09::Basic::Consume.new(subscription_options))
81
+ client.send_frame(Qrack::Protocol::Basic::Consume.new(subscription_options))
77
82
 
78
83
  method = client.next_method
79
84
 
80
- client.check_response(method, Qrack::Protocol09::Basic::ConsumeOk, "Error subscribing to queue #{queue.name}")
85
+ client.check_response(method, Qrack::Protocol::Basic::ConsumeOk, "Error subscribing to queue #{queue.name}, got #{method}")
81
86
 
82
87
  @consumer_tag = method.consumer_tag
83
88
  end
data/lib/bunny/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Bunny
4
- VERSION = "0.7.13"
4
+ VERSION = "0.8.0"
5
5
  end
data/lib/bunny.rb CHANGED
@@ -34,25 +34,21 @@ module Bunny
34
34
  # Instantiates new Bunny::Client
35
35
 
36
36
  def self.new(connection_string_or_opts = Hash.new, opts = Hash.new)
37
- # Set up Bunny according to AMQP spec version required
37
+ # Set up Bunny
38
38
  if connection_string_or_opts.respond_to?(:keys) && opts.empty?
39
39
  opts = connection_string_or_opts
40
40
  end
41
41
 
42
- spec_version = opts[:spec] || '08'
43
-
44
42
  # Return client
45
- setup(spec_version, connection_string_or_opts, opts)
43
+ setup(connection_string_or_opts, opts)
46
44
  end
47
45
 
48
- # Runs a code block using a short-lived connection
49
-
50
- def self.run(opts = {}, &block)
46
+ # Runs a code block using a Bunny connection
47
+ def self.run(connection_string_or_opts = {}, opts = {}, &block)
51
48
  raise ArgumentError, 'Bunny#run requires a block' unless block
52
49
 
53
- # Set up Bunny according to AMQP spec version required
54
- spec_version = opts[:spec] || '08'
55
- client = setup(spec_version, opts)
50
+ # Set up Bunny
51
+ client = setup(connection_string_or_opts, opts)
56
52
 
57
53
  begin
58
54
  client.start
@@ -78,32 +74,18 @@ module Bunny
78
74
 
79
75
  private
80
76
 
81
- def self.setup(version, *args)
82
- if version == '08'
83
- # AMQP 0-8 specification
84
- require 'qrack/qrack08'
85
- require 'bunny/client08'
86
- require 'bunny/exchange08'
87
- require 'bunny/queue08'
88
- require 'bunny/channel08'
89
- require 'bunny/subscription08'
90
-
91
- client = Bunny::Client.new(*args)
92
- else
93
- # AMQP 0-9-1 specification
94
- require 'qrack/qrack09'
95
- require 'bunny/client09'
96
- require 'bunny/exchange09'
97
- require 'bunny/queue09'
98
- require 'bunny/channel09'
99
- require 'bunny/subscription09'
100
-
101
- client = Bunny::Client09.new(*args)
102
- end
77
+ def self.setup(*args)
78
+ # AMQP 0-9-1 specification
79
+ require 'qrack/qrack'
80
+ require 'bunny/client'
81
+ require 'bunny/exchange'
82
+ require 'bunny/queue'
83
+ require 'bunny/channel'
84
+ require 'bunny/subscription'
103
85
 
104
86
  include Qrack
105
87
 
106
- client
88
+ client = Bunny::Client.new(*args)
107
89
  end
108
90
 
109
91
  end