sparqcode_bunny 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +10 -0
  2. data/.rspec +3 -0
  3. data/.travis.yml +15 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG +27 -0
  6. data/Gemfile +39 -0
  7. data/LICENSE +21 -0
  8. data/README.textile +82 -0
  9. data/Rakefile +14 -0
  10. data/bunny.gemspec +43 -0
  11. data/examples/simple_08.rb +32 -0
  12. data/examples/simple_09.rb +32 -0
  13. data/examples/simple_ack_08.rb +35 -0
  14. data/examples/simple_ack_09.rb +35 -0
  15. data/examples/simple_consumer_08.rb +55 -0
  16. data/examples/simple_consumer_09.rb +55 -0
  17. data/examples/simple_fanout_08.rb +41 -0
  18. data/examples/simple_fanout_09.rb +41 -0
  19. data/examples/simple_headers_08.rb +42 -0
  20. data/examples/simple_headers_09.rb +42 -0
  21. data/examples/simple_publisher_08.rb +29 -0
  22. data/examples/simple_publisher_09.rb +29 -0
  23. data/examples/simple_topic_08.rb +61 -0
  24. data/examples/simple_topic_09.rb +61 -0
  25. data/ext/amqp-0.8.json +616 -0
  26. data/ext/amqp-0.9.1.json +388 -0
  27. data/ext/config.yml +4 -0
  28. data/ext/qparser.rb +469 -0
  29. data/lib/bunny/channel08.rb +39 -0
  30. data/lib/bunny/channel09.rb +39 -0
  31. data/lib/bunny/client08.rb +472 -0
  32. data/lib/bunny/client09.rb +374 -0
  33. data/lib/bunny/consumer.rb +35 -0
  34. data/lib/bunny/exchange08.rb +171 -0
  35. data/lib/bunny/exchange09.rb +159 -0
  36. data/lib/bunny/queue08.rb +403 -0
  37. data/lib/bunny/queue09.rb +325 -0
  38. data/lib/bunny/subscription08.rb +87 -0
  39. data/lib/bunny/subscription09.rb +87 -0
  40. data/lib/bunny/system_timer.rb +14 -0
  41. data/lib/bunny/version.rb +5 -0
  42. data/lib/bunny.rb +109 -0
  43. data/lib/qrack/amq-client-url.rb +165 -0
  44. data/lib/qrack/channel.rb +20 -0
  45. data/lib/qrack/client.rb +235 -0
  46. data/lib/qrack/errors.rb +5 -0
  47. data/lib/qrack/protocol/protocol08.rb +134 -0
  48. data/lib/qrack/protocol/protocol09.rb +135 -0
  49. data/lib/qrack/protocol/spec08.rb +828 -0
  50. data/lib/qrack/protocol/spec09.rb +524 -0
  51. data/lib/qrack/qrack08.rb +20 -0
  52. data/lib/qrack/qrack09.rb +20 -0
  53. data/lib/qrack/queue.rb +40 -0
  54. data/lib/qrack/subscription.rb +112 -0
  55. data/lib/qrack/transport/buffer08.rb +278 -0
  56. data/lib/qrack/transport/buffer09.rb +280 -0
  57. data/lib/qrack/transport/frame08.rb +117 -0
  58. data/lib/qrack/transport/frame09.rb +97 -0
  59. data/spec/spec_08/bunny_spec.rb +77 -0
  60. data/spec/spec_08/connection_spec.rb +25 -0
  61. data/spec/spec_08/exchange_spec.rb +173 -0
  62. data/spec/spec_08/queue_spec.rb +235 -0
  63. data/spec/spec_09/amqp_url_spec.rb +19 -0
  64. data/spec/spec_09/bunny_spec.rb +76 -0
  65. data/spec/spec_09/connection_spec.rb +29 -0
  66. data/spec/spec_09/exchange_spec.rb +173 -0
  67. data/spec/spec_09/queue_spec.rb +248 -0
  68. metadata +151 -0
@@ -0,0 +1,524 @@
1
+
2
+ # encoding: utf-8
3
+
4
+
5
+ #:stopdoc:
6
+ # this file was autogenerated on 2011-07-21 07:07:06 +0100
7
+ # using amqp-0.9.1.json (mtime: 2011-07-20 19:10:34 +0100)
8
+ #
9
+ # DO NOT EDIT! (edit ext/qparser.rb and config.yml instead, and run 'ruby qparser.rb')
10
+
11
+ module Qrack
12
+ module Protocol09
13
+ HEADER = "AMQP".freeze
14
+ VERSION_MAJOR = 0
15
+ VERSION_MINOR = 9
16
+ REVISION = 1
17
+ PORT = 5672
18
+
19
+ RESPONSES = {
20
+ 200 => :REPLY_SUCCESS,
21
+ 311 => :CONTENT_TOO_LARGE,
22
+ 312 => :NO_ROUTE,
23
+ 313 => :NO_CONSUMERS,
24
+ 320 => :CONNECTION_FORCED,
25
+ 402 => :INVALID_PATH,
26
+ 403 => :ACCESS_REFUSED,
27
+ 404 => :NOT_FOUND,
28
+ 405 => :RESOURCE_LOCKED,
29
+ 406 => :PRECONDITION_FAILED,
30
+ 502 => :SYNTAX_ERROR,
31
+ 503 => :COMMAND_INVALID,
32
+ 504 => :CHANNEL_ERROR,
33
+ 505 => :UNEXPECTED_FRAME,
34
+ 506 => :RESOURCE_ERROR,
35
+ 530 => :NOT_ALLOWED,
36
+ 540 => :NOT_IMPLEMENTED,
37
+ 541 => :INTERNAL_ERROR,
38
+ }
39
+
40
+ FIELDS = [
41
+ :bit,
42
+ :long,
43
+ :longlong,
44
+ :longstr,
45
+ :octet,
46
+ :short,
47
+ :shortstr,
48
+ :table,
49
+ :timestamp,
50
+ ]
51
+
52
+ class Class
53
+ class << self
54
+ FIELDS.each do |f|
55
+ class_eval %[
56
+ def #{f} name
57
+ properties << [ :#{f}, name ] unless properties.include?([:#{f}, name])
58
+ attr_accessor name
59
+ end
60
+ ]
61
+ end
62
+
63
+ def properties() @properties ||= [] end
64
+
65
+ def id() self::ID end
66
+ def name() self::NAME.to_s end
67
+ end
68
+
69
+ class Method
70
+ class << self
71
+ FIELDS.each do |f|
72
+ class_eval %[
73
+ def #{f} name
74
+ arguments << [ :#{f}, name ] unless arguments.include?([:#{f}, name])
75
+ attr_accessor name
76
+ end
77
+ ]
78
+ end
79
+
80
+ def arguments() @arguments ||= [] end
81
+
82
+ def parent() Protocol09.const_get(self.to_s[/Protocol09::(.+?)::/,1]) end
83
+ def id() self::ID end
84
+ def name() self::NAME.to_s end
85
+ end
86
+
87
+ def == b
88
+ self.class.arguments.inject(true) do |eql, (type, name)|
89
+ eql and __send__("#{name}") == b.__send__("#{name}")
90
+ end
91
+ end
92
+ end
93
+
94
+ def self.methods() @methods ||= {} end
95
+
96
+ def self.Method(id, name)
97
+ @_base_methods ||= {}
98
+ @_base_methods[id] ||= ::Class.new(Method) do
99
+ class_eval %[
100
+ def self.inherited klass
101
+ klass.const_set(:ID, #{id})
102
+ klass.const_set(:NAME, :#{name.to_s})
103
+ klass.parent.methods[#{id}] = klass
104
+ klass.parent.methods[klass::NAME] = klass
105
+ end
106
+ ]
107
+ end
108
+ end
109
+ end
110
+
111
+ def self.classes() @classes ||= {} end
112
+
113
+ def self.Class(id, name)
114
+ @_base_classes ||= {}
115
+ @_base_classes[id] ||= ::Class.new(Class) do
116
+ class_eval %[
117
+ def self.inherited klass
118
+ klass.const_set(:ID, #{id})
119
+ klass.const_set(:NAME, :#{name.to_s})
120
+ Protocol09.classes[#{id}] = klass
121
+ Protocol09.classes[klass::NAME] = klass
122
+ end
123
+ ]
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ module Qrack
130
+ module Protocol09
131
+ class Connection < Class( 10, :connection ); end
132
+ class Channel < Class( 20, :channel ); end
133
+ class Exchange < Class( 40, :exchange ); end
134
+ class Queue < Class( 50, :queue ); end
135
+ class Basic < Class( 60, :basic ); end
136
+ class Tx < Class( 90, :tx ); end
137
+
138
+ class Connection
139
+
140
+ class Start < Method( 10, :start ); end
141
+ class StartOk < Method( 11, :start_ok ); end
142
+ class Secure < Method( 20, :secure ); end
143
+ class SecureOk < Method( 21, :secure_ok ); end
144
+ class Tune < Method( 30, :tune ); end
145
+ class TuneOk < Method( 31, :tune_ok ); end
146
+ class Open < Method( 40, :open ); end
147
+ class OpenOk < Method( 41, :open_ok ); end
148
+ class Close < Method( 50, :close ); end
149
+ class CloseOk < Method( 51, :close_ok ); end
150
+
151
+
152
+ class Start
153
+ octet :version_major
154
+ octet :version_minor
155
+ table :server_properties
156
+ longstr :mechanisms
157
+ longstr :locales
158
+ end
159
+
160
+ class StartOk
161
+ table :client_properties
162
+ shortstr :mechanism
163
+ longstr :response
164
+ shortstr :locale
165
+ end
166
+
167
+ class Secure
168
+ longstr :challenge
169
+ end
170
+
171
+ class SecureOk
172
+ longstr :response
173
+ end
174
+
175
+ class Tune
176
+ short :channel_max
177
+ long :frame_max
178
+ short :heartbeat
179
+ end
180
+
181
+ class TuneOk
182
+ short :channel_max
183
+ long :frame_max
184
+ short :heartbeat
185
+ end
186
+
187
+ class Open
188
+ shortstr :virtual_host
189
+ shortstr :deprecated_capabilities
190
+ bit :deprecated_insist
191
+ end
192
+
193
+ class OpenOk
194
+ shortstr :deprecated_known_hosts
195
+ end
196
+
197
+ class Close
198
+ short :reply_code
199
+ shortstr :reply_text
200
+ short :class_id
201
+ short :method_id
202
+ end
203
+
204
+ class CloseOk
205
+ end
206
+
207
+ end
208
+
209
+ class Channel
210
+
211
+ class Open < Method( 10, :open ); end
212
+ class OpenOk < Method( 11, :open_ok ); end
213
+ class Flow < Method( 20, :flow ); end
214
+ class FlowOk < Method( 21, :flow_ok ); end
215
+ class Close < Method( 40, :close ); end
216
+ class CloseOk < Method( 41, :close_ok ); end
217
+
218
+
219
+ class Open
220
+ shortstr :deprecated_out_of_band
221
+ end
222
+
223
+ class OpenOk
224
+ longstr :deprecated_channel_id
225
+ end
226
+
227
+ class Flow
228
+ bit :active
229
+ end
230
+
231
+ class FlowOk
232
+ bit :active
233
+ end
234
+
235
+ class Close
236
+ short :reply_code
237
+ shortstr :reply_text
238
+ short :class_id
239
+ short :method_id
240
+ end
241
+
242
+ class CloseOk
243
+ end
244
+
245
+ end
246
+
247
+ class Exchange
248
+
249
+ class Declare < Method( 10, :declare ); end
250
+ class DeclareOk < Method( 11, :declare_ok ); end
251
+ class Delete < Method( 20, :delete ); end
252
+ class DeleteOk < Method( 21, :delete_ok ); end
253
+
254
+
255
+ class Declare
256
+ short :deprecated_ticket
257
+ shortstr :exchange
258
+ shortstr :type
259
+ bit :passive
260
+ bit :durable
261
+ bit :deprecated_auto_delete
262
+ bit :deprecated_internal
263
+ bit :nowait
264
+ table :arguments
265
+ end
266
+
267
+ class DeclareOk
268
+ end
269
+
270
+ class Delete
271
+ short :deprecated_ticket
272
+ shortstr :exchange
273
+ bit :if_unused
274
+ bit :nowait
275
+ end
276
+
277
+ class DeleteOk
278
+ end
279
+
280
+ end
281
+
282
+ class Queue
283
+
284
+ class Declare < Method( 10, :declare ); end
285
+ class DeclareOk < Method( 11, :declare_ok ); end
286
+ class Bind < Method( 20, :bind ); end
287
+ class BindOk < Method( 21, :bind_ok ); end
288
+ class Purge < Method( 30, :purge ); end
289
+ class PurgeOk < Method( 31, :purge_ok ); end
290
+ class Delete < Method( 40, :delete ); end
291
+ class DeleteOk < Method( 41, :delete_ok ); end
292
+ class Unbind < Method( 50, :unbind ); end
293
+ class UnbindOk < Method( 51, :unbind_ok ); end
294
+
295
+
296
+ class Declare
297
+ short :deprecated_ticket
298
+ shortstr :queue
299
+ bit :passive
300
+ bit :durable
301
+ bit :exclusive
302
+ bit :auto_delete
303
+ bit :nowait
304
+ table :arguments
305
+ end
306
+
307
+ class DeclareOk
308
+ shortstr :queue
309
+ long :message_count
310
+ long :consumer_count
311
+ end
312
+
313
+ class Bind
314
+ short :deprecated_ticket
315
+ shortstr :queue
316
+ shortstr :exchange
317
+ shortstr :routing_key
318
+ bit :nowait
319
+ table :arguments
320
+ end
321
+
322
+ class BindOk
323
+ end
324
+
325
+ class Purge
326
+ short :deprecated_ticket
327
+ shortstr :queue
328
+ bit :nowait
329
+ end
330
+
331
+ class PurgeOk
332
+ long :message_count
333
+ end
334
+
335
+ class Delete
336
+ short :deprecated_ticket
337
+ shortstr :queue
338
+ bit :if_unused
339
+ bit :if_empty
340
+ bit :nowait
341
+ end
342
+
343
+ class DeleteOk
344
+ long :message_count
345
+ end
346
+
347
+ class Unbind
348
+ short :deprecated_ticket
349
+ shortstr :queue
350
+ shortstr :exchange
351
+ shortstr :routing_key
352
+ table :arguments
353
+ end
354
+
355
+ class UnbindOk
356
+ end
357
+
358
+ end
359
+
360
+ class Basic
361
+ shortstr :content_type
362
+ shortstr :content_encoding
363
+ table :headers
364
+ octet :delivery_mode
365
+ octet :priority
366
+ shortstr :correlation_id
367
+ shortstr :reply_to
368
+ shortstr :expiration
369
+ shortstr :message_id
370
+ timestamp :timestamp
371
+ shortstr :type
372
+ shortstr :user_id
373
+ shortstr :app_id
374
+ shortstr :deprecated_cluster_id
375
+
376
+ class Qos < Method( 10, :qos ); end
377
+ class QosOk < Method( 11, :qos_ok ); end
378
+ class Consume < Method( 20, :consume ); end
379
+ class ConsumeOk < Method( 21, :consume_ok ); end
380
+ class Cancel < Method( 30, :cancel ); end
381
+ class CancelOk < Method( 31, :cancel_ok ); end
382
+ class Publish < Method( 40, :publish ); end
383
+ class Return < Method( 50, :return ); end
384
+ class Deliver < Method( 60, :deliver ); end
385
+ class Get < Method( 70, :get ); end
386
+ class GetOk < Method( 71, :get_ok ); end
387
+ class GetEmpty < Method( 72, :get_empty ); end
388
+ class Ack < Method( 80, :ack ); end
389
+ class Reject < Method( 90, :reject ); end
390
+ class RecoverAsync < Method( 100, :recover_async ); end
391
+ class Recover < Method( 110, :recover ); end
392
+ class RecoverOk < Method( 111, :recover_ok ); end
393
+
394
+
395
+ class Qos
396
+ long :prefetch_size
397
+ short :prefetch_count
398
+ bit :global
399
+ end
400
+
401
+ class QosOk
402
+ end
403
+
404
+ class Consume
405
+ short :deprecated_ticket
406
+ shortstr :queue
407
+ shortstr :consumer_tag
408
+ bit :no_local
409
+ bit :no_ack
410
+ bit :exclusive
411
+ bit :nowait
412
+ table :filter
413
+ end
414
+
415
+ class ConsumeOk
416
+ shortstr :consumer_tag
417
+ end
418
+
419
+ class Cancel
420
+ shortstr :consumer_tag
421
+ bit :nowait
422
+ end
423
+
424
+ class CancelOk
425
+ shortstr :consumer_tag
426
+ end
427
+
428
+ class Publish
429
+ short :deprecated_ticket
430
+ shortstr :exchange
431
+ shortstr :routing_key
432
+ bit :mandatory
433
+ bit :immediate
434
+ end
435
+
436
+ class Return
437
+ short :reply_code
438
+ shortstr :reply_text
439
+ shortstr :exchange
440
+ shortstr :routing_key
441
+ end
442
+
443
+ class Deliver
444
+ shortstr :consumer_tag
445
+ longlong :delivery_tag
446
+ bit :redelivered
447
+ shortstr :exchange
448
+ shortstr :routing_key
449
+ end
450
+
451
+ class Get
452
+ short :deprecated_ticket
453
+ shortstr :queue
454
+ bit :no_ack
455
+ end
456
+
457
+ class GetOk
458
+ longlong :delivery_tag
459
+ bit :redelivered
460
+ shortstr :exchange
461
+ shortstr :routing_key
462
+ long :message_count
463
+ end
464
+
465
+ class GetEmpty
466
+ shortstr :deprecated_cluster_id
467
+ end
468
+
469
+ class Ack
470
+ longlong :delivery_tag
471
+ bit :multiple
472
+ end
473
+
474
+ class Reject
475
+ longlong :delivery_tag
476
+ bit :requeue
477
+ end
478
+
479
+ class RecoverAsync
480
+ bit :requeue
481
+ end
482
+
483
+ class Recover
484
+ bit :requeue
485
+ end
486
+
487
+ class RecoverOk
488
+ end
489
+
490
+ end
491
+
492
+ class Tx
493
+
494
+ class Select < Method( 10, :select ); end
495
+ class SelectOk < Method( 11, :select_ok ); end
496
+ class Commit < Method( 20, :commit ); end
497
+ class CommitOk < Method( 21, :commit_ok ); end
498
+ class Rollback < Method( 30, :rollback ); end
499
+ class RollbackOk < Method( 31, :rollback_ok ); end
500
+
501
+
502
+ class Select
503
+ end
504
+
505
+ class SelectOk
506
+ end
507
+
508
+ class Commit
509
+ end
510
+
511
+ class CommitOk
512
+ end
513
+
514
+ class Rollback
515
+ end
516
+
517
+ class RollbackOk
518
+ end
519
+
520
+ end
521
+
522
+ end
523
+
524
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ $: << File.expand_path(File.dirname(__FILE__))
4
+
5
+ require 'protocol/spec08'
6
+ require 'protocol/protocol08'
7
+
8
+ require 'transport/buffer08'
9
+ require 'transport/frame08'
10
+
11
+ require 'qrack/client'
12
+ require 'qrack/channel'
13
+ require 'qrack/queue'
14
+ require 'bunny/consumer'
15
+ require 'qrack/errors'
16
+
17
+ module Qrack
18
+ include Protocol
19
+ include Transport
20
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ $: << File.expand_path(File.dirname(__FILE__))
4
+
5
+ require 'protocol/spec09'
6
+ require 'protocol/protocol09'
7
+
8
+ require 'transport/buffer09'
9
+ require 'transport/frame09'
10
+
11
+ require 'qrack/client'
12
+ require 'qrack/channel'
13
+ require 'qrack/queue'
14
+ require 'bunny/consumer'
15
+ require 'qrack/errors'
16
+
17
+ module Qrack
18
+ include Protocol09
19
+ include Transport09
20
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module Qrack
4
+
5
+ # Queue ancestor class
6
+ class Queue
7
+
8
+ # @return [AMQ::Client::Consumer] Default consumer (registered with {Queue#subscribe}).
9
+ attr_accessor :default_consumer
10
+
11
+ attr_reader :name, :client
12
+
13
+ attr_accessor :delivery_tag
14
+
15
+
16
+ # Returns consumer count from {Queue#status}.
17
+ def consumer_count
18
+ s = status
19
+ s[:consumer_count]
20
+ end
21
+
22
+ # Returns message count from {Queue#status}.
23
+ def message_count
24
+ s = status
25
+ s[:message_count]
26
+ end
27
+
28
+ # Publishes a message to the queue via the default nameless '' direct exchange.
29
+
30
+ # @return [NilClass] nil
31
+ # @deprecated
32
+ # @note This method will be removed before 0.8 release.
33
+ def publish(data, opts = {})
34
+ Bunny.deprecation_warning("Qrack::Queue#publish", "0.8", "Use direct_exchange = bunny.exchange(''); direct_exchange.publish('message', key: queue.name) if you want to publish directly to one given queue. For more informations see https://github.com/ruby-amqp/bunny/issues/15 and for more theoretical explanation check http://bit.ly/nOF1CK")
35
+ exchange.publish(data, opts)
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,112 @@
1
+ # encoding: utf-8
2
+
3
+ #################################################
4
+ # WARNING: THIS CLASS IS DEPRECATED, DO NOT #
5
+ # USE IT DIRECTLY! USE BUNNY::CONSUMER INSTEAD! #
6
+ #################################################
7
+
8
+ module Qrack
9
+ # Subscription ancestor class
10
+ # @deprecated
11
+ class Subscription
12
+
13
+ attr_accessor :consumer_tag, :delivery_tag, :message_max, :timeout, :ack, :exclusive, :break_when_empty
14
+ attr_reader :client, :queue, :message_count
15
+
16
+ def initialize(client, queue, opts = {})
17
+ @client = client
18
+ @queue = queue
19
+
20
+ # Get timeout value
21
+ @timeout = opts[:timeout] || nil
22
+
23
+ # Get maximum amount of messages to process
24
+ @message_max = opts[:message_max] || nil
25
+
26
+ # If a consumer tag is not passed in the server will generate one
27
+ @consumer_tag = opts[:consumer_tag] || nil
28
+
29
+ # In a subscription loop, stop listening if there are no more messages in the queue
30
+ @break_when_empty = opts[:break_when_empty] || nil
31
+
32
+ # Ignore the :nowait option if passed, otherwise program will hang waiting for a
33
+ # response from the server causing an error.
34
+ opts.delete(:nowait)
35
+
36
+ # Do we want to have to provide an acknowledgement?
37
+ @ack = opts[:ack] || nil
38
+
39
+ # Does this consumer want exclusive use of the queue?
40
+ @exclusive = opts[:exclusive] || false
41
+
42
+ # Initialize message counter
43
+ @message_count = 0
44
+
45
+ # Store options
46
+ @opts = opts
47
+ end
48
+
49
+ def start(&blk)
50
+ # Do not process any messages if zero message_max
51
+ if message_max == 0
52
+ return
53
+ end
54
+
55
+ # Notify server about new consumer
56
+ setup_consumer
57
+
58
+ # Start subscription loop
59
+ loop do
60
+
61
+ begin
62
+ method = client.next_method(:timeout => timeout)
63
+ rescue Qrack::FrameTimeout
64
+ # Stop consuming messages
65
+ queue.unsubscribe()
66
+ break
67
+ end
68
+
69
+ # Increment message counter
70
+ @message_count += 1
71
+
72
+ # get delivery tag to use for acknowledge
73
+ queue.delivery_tag = method.delivery_tag if @ack
74
+
75
+ header = client.next_payload
76
+
77
+ # If maximum frame size is smaller than message payload body then message
78
+ # will have a message header and several message bodies
79
+ msg = ''
80
+ while msg.length < header.size
81
+ msg << client.next_payload
82
+ end
83
+
84
+ # If block present, pass the message info to the block for processing
85
+ msg = {:header => header, :payload => msg, :delivery_details => method.arguments, :subscribed => true}
86
+ blk.call(msg) unless blk.nil?
87
+
88
+ # Exit loop if message_max condition met
89
+ if (!message_max.nil? and message_count == message_max)
90
+ # Stop consuming messages
91
+ queue.unsubscribe()
92
+ queue.ack() if @ack
93
+ break
94
+ elsif(!msg[:subscribed])
95
+ queue.unsubscribe()
96
+ queue.ack() if @ack
97
+ break
98
+ elsif(@break_when_empty && queue.message_count == 0)
99
+ queue.unsubscribe()
100
+ queue.ack() if @ack
101
+ break
102
+ end
103
+
104
+ # Have to do the ack here because the ack triggers the release of messages from the server
105
+ # if you are using Client#qos prefetch and you will get extra messages sent through before
106
+ # the unsubscribe takes effect to stop messages being sent to this consumer unless the ack is
107
+ # deferred.
108
+ queue.ack() if @ack
109
+ end
110
+ end
111
+ end
112
+ end