Class: Bunny::Queue

Inherits:
Object
  • Object
show all
Defined in:
lib/bunny/queue.rb

Overview

Represents AMQP 0.9.1 queue.

See Also:

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Queue) initialize(channel, name = AMQ::Protocol::EMPTY_STRING, opts = {})

Returns a new instance of Queue

Parameters:

  • channel (Bunny::Channel)

    Channel this queue will use.

  • name (String) (defaults to: AMQ::Protocol::EMPTY_STRING)

    Queue name. Pass an empty string to make RabbitMQ generate a unique one.

  • opts (Hash) (defaults to: {})

    Queue properties

Options Hash (opts):

  • :durable (Boolean) — default: false

    Should this queue be durable?

  • :auto_delete (Boolean) — default: false

    Should this queue be automatically deleted when the last consumer disconnects?

  • :exclusive (Boolean) — default: false

    Should this queue be exclusive (only can be used by this connection, removed when the connection is closed)?

  • :arguments (Boolean) — default: {}

    Additional optional arguments (typically used by RabbitMQ extensions and plugins)

See Also:



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/bunny/queue.rb', line 34

def initialize(channel, name = AMQ::Protocol::EMPTY_STRING, opts = {})
  # old Bunny versions pass a connection here. In that case,
  # we just use default channel from it. MK.
  @channel          = channel
  @name             = name
  @options          = self.class.add_default_options(name, opts)
  @consumers        = Hash.new

  @durable          = @options[:durable]
  @exclusive        = @options[:exclusive]
  @server_named     = @name.empty?
  @auto_delete      = @options[:auto_delete]
  @arguments        = @options[:arguments]

  @bindings         = Array.new

  @default_consumer = nil

  declare! unless opts[:no_declare]

  @channel.register_queue(self)
end

Instance Attribute Details

- (Bunny::Channel) channel (readonly)

Returns Channel this queue uses

Returns:



15
16
17
# File 'lib/bunny/queue.rb', line 15

def channel
  @channel
end

- (String) name (readonly)

Returns Queue name

Returns:

  • (String)

    Queue name



17
18
19
# File 'lib/bunny/queue.rb', line 17

def name
  @name
end

- (Hash) options (readonly)

Returns Options this queue was created with

Returns:

  • (Hash)

    Options this queue was created with



19
20
21
# File 'lib/bunny/queue.rb', line 19

def options
  @options
end

Instance Method Details

- (Hash) arguments

Returns Additional optional arguments (typically used by RabbitMQ extensions and plugins)

Returns:

  • (Hash)

    Additional optional arguments (typically used by RabbitMQ extensions and plugins)



87
88
89
# File 'lib/bunny/queue.rb', line 87

def arguments
  @arguments
end

- (Boolean) auto_delete?

Returns true if this queue was declared as automatically deleted (deleted as soon as last consumer unbinds).

Returns:

  • (Boolean)

    true if this queue was declared as automatically deleted (deleted as soon as last consumer unbinds).

See Also:



74
75
76
# File 'lib/bunny/queue.rb', line 74

def auto_delete?
  @auto_delete
end

- (Object) bind(exchange, opts = {})

Binds queue to an exchange

Parameters:

  • exchange (Bunny::Exchange, String)

    Exchange to bind to

  • opts (Hash) (defaults to: {})

    Binding properties

Options Hash (opts):

  • :routing_key (String)

    Routing key

  • :arguments (Hash) — default: {}

    Additional optional binding arguments

See Also:



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/bunny/queue.rb', line 102

def bind(exchange, opts = {})
  @channel.queue_bind(@name, exchange, opts)

  exchange_name = if exchange.respond_to?(:name)
                    exchange.name
                  else
                    exchange
                  end


  # store bindings for automatic recovery. We need to be very careful to
  # not cause an infinite rebinding loop here when we recover. MK.
  binding = { :exchange => exchange_name, :routing_key => (opts[:routing_key] || opts[:key]), :arguments => opts[:arguments] }
  @bindings.push(binding) unless @bindings.include?(binding)

  self
end

- (Integer) consumer_count

Returns How many active consumers the queue has

Returns:

  • (Integer)

    How many active consumers the queue has



315
316
317
318
# File 'lib/bunny/queue.rb', line 315

def consumer_count
  s = self.status
  s[:consumer_count]
end

- (Object) delete(opts = {})

Deletes the queue

Parameters:

  • opts (Hash) (defaults to: {})

    Options

Options Hash (opts):

  • if_unused (Boolean) — default: false

    Should this queue be deleted only if it has no consumers?

  • if_empty (Boolean) — default: false

    Should this queue be deleted only if it has no messages?

See Also:



285
286
287
288
# File 'lib/bunny/queue.rb', line 285

def delete(opts = {})
  @channel.deregister_queue(self)
  @channel.queue_delete(@name, opts)
end

- (Boolean) durable?

Returns true if this queue was declared as durable (will survive broker restart).

Returns:

  • (Boolean)

    true if this queue was declared as durable (will survive broker restart).

See Also:



60
61
62
# File 'lib/bunny/queue.rb', line 60

def durable?
  @durable
end

- (Boolean) exclusive?

Returns true if this queue was declared as exclusive (limited to just one consumer)

Returns:

  • (Boolean)

    true if this queue was declared as exclusive (limited to just one consumer)

See Also:



67
68
69
# File 'lib/bunny/queue.rb', line 67

def exclusive?
  @exclusive
end

- (Integer) message_count

Returns How many messages the queue has ready (e.g. not delivered but not unacknowledged)

Returns:

  • (Integer)

    How many messages the queue has ready (e.g. not delivered but not unacknowledged)



309
310
311
312
# File 'lib/bunny/queue.rb', line 309

def message_count
  s = self.status
  s[:message_count]
end

- (Array) pop(opts = {:manual_ack => false}, &block) Also known as: get

Returns Triple of delivery info, message properties and message content. If the queue is empty, all three will be nils.

Examples:

conn = Bunny.new
conn.start

ch   = conn.create_channel
q = ch.queue("test1")
x = ch.default_exchange
x.publish("Hello, everybody!", :routing_key => 'test1')

delivery_info, properties, payload = q.pop

puts "This is the message: " + payload + "\n\n"
conn.close

Parameters:

  • opts (Hash) (defaults to: {:manual_ack => false})

    Options

Options Hash (opts):

  • :ack (Boolean) — default: false

    [DEPRECATED] Use :manual_ack instead

  • :manual_ack (Boolean) — default: false

    Will the message be acknowledged manually?

Returns:

  • (Array)

    Triple of delivery info, message properties and message content. If the queue is empty, all three will be nils.

See Also:



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/bunny/queue.rb', line 234

def pop(opts = {:manual_ack => false}, &block)
  unless opts[:ack].nil?
    warn "[DEPRECATION] `:ack` is deprecated.  Please use `:manual_ack` instead."
    opts[:manual_ack] = opts[:ack]
  end

  get_response, properties, content = @channel.basic_get(@name, opts)

  if block
    if properties
      di = GetResponse.new(get_response, properties, @channel)
      mp = MessageProperties.new(properties)

      block.call(di, mp, content)
    else
      block.call(nil, nil, nil)
    end
  else
    if properties
      di = GetResponse.new(get_response, properties, @channel)
      mp = MessageProperties.new(properties)
      [di, mp, content]
    else
      [nil, nil, nil]
    end
  end
end

- (Object) publish(payload, opts = {})

Publishes a message to the queue via default exchange. Takes the same arguments as Exchange#publish



269
270
271
272
273
# File 'lib/bunny/queue.rb', line 269

def publish(payload, opts = {})
  @channel.default_exchange.publish(payload, opts.merge(:routing_key => @name))

  self
end

- (Object) purge(opts = {})

Purges a queue (removes all messages from it)



293
294
295
296
297
# File 'lib/bunny/queue.rb', line 293

def purge(opts = {})
  @channel.queue_purge(@name, opts)

  self
end

- (Boolean) server_named?

Returns true if this queue was declared as server named.

Returns:

  • (Boolean)

    true if this queue was declared as server named.

See Also:



81
82
83
# File 'lib/bunny/queue.rb', line 81

def server_named?
  @server_named
end

- (Hash) status

Returns A hash with information about the number of queue messages and consumers

Returns:

  • (Hash)

    A hash with information about the number of queue messages and consumers

See Also:



302
303
304
305
306
# File 'lib/bunny/queue.rb', line 302

def status
  queue_declare_ok = @channel.queue_declare(@name, @options.merge(:passive => true))
  {:message_count => queue_declare_ok.message_count,
    :consumer_count => queue_declare_ok.consumer_count}
end

- (Object) subscribe(opts = { :consumer_tag => @channel.generate_consumer_tag, :manual_ack => false, :exclusive => false, :block => false, :on_cancellation => nil }, &block)

Adds a consumer to the queue (subscribes for message deliveries).

Parameters:

  • opts (Hash) (defaults to: { :consumer_tag => @channel.generate_consumer_tag, :manual_ack => false, :exclusive => false, :block => false, :on_cancellation => nil })

    Options

Options Hash (opts):

  • :ack (Boolean) — default: false

    [DEPRECATED] Use :manual_ack instead

  • :manual_ack (Boolean) — default: false

    Will this consumer use manual acknowledgements?

  • :exclusive (Boolean) — default: false

    Should this consumer be exclusive for this queue?

  • :block (Boolean) — default: false

    Should the call block calling thread?

  • :on_cancellation (#call)

    Block to execute when this consumer is cancelled remotely (e.g. via the RabbitMQ Management plugin)

  • :consumer_tag (String)

    Unique consumer identifier. It is usually recommended to let Bunny generate it for you.

  • :arguments (Hash) — default: {}

    Additional (optional) arguments, typically used by RabbitMQ extensions

See Also:



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/bunny/queue.rb', line 160

def subscribe(opts = {
                :consumer_tag    => @channel.generate_consumer_tag,
                :manual_ack      => false,
                :exclusive       => false,
                :block           => false,
                :on_cancellation => nil
              }, &block)

  unless opts[:ack].nil?
    warn "[DEPRECATION] `:ack` is deprecated.  Please use `:manual_ack` instead."
    opts[:manual_ack] = opts[:ack]
  end

  ctag       = opts.fetch(:consumer_tag, @channel.generate_consumer_tag)
  consumer   = Consumer.new(@channel,
                            self,
                            ctag,
                            !opts[:manual_ack],
                            opts[:exclusive],
                            opts[:arguments])

  consumer.on_delivery(&block)
  consumer.on_cancellation(&opts[:on_cancellation]) if opts[:on_cancellation]

  @channel.basic_consume_with(consumer)
  if opts[:block]
    # joins current thread with the consumers pool, will block
    # the current thread for as long as the consumer pool is active
    @channel.work_pool.join
  end

  consumer
end

- (Object) subscribe_with(consumer, opts = {:block => false})

Adds a consumer object to the queue (subscribes for message deliveries).

Parameters:

  • consumer (Bunny::Consumer)

    a Consumer subclass that implements consumer interface

  • opts (Hash) (defaults to: {:block => false})

    Options

Options Hash (opts):

  • block (Boolean) — default: false

    Should the call block calling thread?

See Also:



203
204
205
206
207
208
# File 'lib/bunny/queue.rb', line 203

def subscribe_with(consumer, opts = {:block => false})
  @channel.basic_consume_with(consumer)

  @channel.work_pool.join if opts[:block]
  consumer
end

- (Object) unbind(exchange, opts = {})

Unbinds queue from an exchange

Parameters:

  • exchange (Bunny::Exchange, String)

    Exchange to unbind from

  • opts (Hash) (defaults to: {})

    Binding properties

Options Hash (opts):

  • :routing_key (String)

    Routing key

  • :arguments (Hash) — default: {}

    Additional optional binding arguments

See Also:



131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/bunny/queue.rb', line 131

def unbind(exchange, opts = {})
  @channel.queue_unbind(@name, exchange, opts)

  exchange_name = if exchange.respond_to?(:name)
                    exchange.name
                  else
                    exchange
                  end


  @bindings.delete_if { |b| b[:exchange] == exchange_name && b[:routing_key] == (opts[:routing_key] || opts[:key]) && b[:arguments] == opts[:arguments] }

  self
end