Skip to content

Instantly share code, notes, and snippets.

@rud
Created October 5, 2011 08:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rud/1263921 to your computer and use it in GitHub Desktop.
Save rud/1263921 to your computer and use it in GitHub Desktop.
Demonstrate queue unsubscribe bug
ruby demo-amqp-one-message-subscribers.rb
single-message consumer listening to rapid producer
> PUT msg 0
> PUT msg 1
> PUT msg 2
> PUT msg 3
< GET msg 2 [waited 0.05s][18.95 reqs/sec]
/Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/consumer.rb:246:in `block in <class:Consumer>': undefined method `handle_delivery' for nil:NilClass (NoMethodError)
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:535:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:535:in `receive_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:514:in `receive_frame'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapters/event_machine.rb:326:in `receive_data'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
from demo-amqp-one-message-subscribers.rb:47:in `<main>'
require 'bundler'
Bundler.setup
require 'amqp'
puts "single-message consumer listening to rapid producer"
QUEUE_NAME = 'test.rapid-queue-unsubscription'
PRODUCE_RATE = 1.0/10
CONSUME_RATE = 1.0/9
def start_producer channel
exchange = AMQP::Exchange.new(channel, :direct, "")
n = 0
EM::PeriodicTimer.new(PRODUCE_RATE) do
2.times do
message = "msg #{n}"
exchange.publish(message,
:immediate => true, # IMPORTANT, messages are dropped if nobody listening now
:routing_key => QUEUE_NAME)
puts "> PUT #{message}"
n += 1
end
end
end
def start_consumer channel
EM::PeriodicTimer.new(CONSUME_RATE) do
started = Time.now
tick_queue = channel.queue(QUEUE_NAME)
consumer = AMQP::Consumer.new(channel, tick_queue)
consumer.on_delivery do |metadata, message|
took = Time.now - started
puts "< GET #{message} [waited #{took.round(2)}s][#{(1.0/took).round(2)} reqs/sec]"
metadata.ack
consumer.cancel
end
consumer.consume
end
end
EM.run do
EM.set_quantum(50)
AMQP::Channel.new do |channel|
start_producer channel
end
AMQP::Channel.new do |channel|
start_consumer channel
end
end
> PUT msg 0
< GET msg 0 [waited 0.0s][511.25 reqs/sec]
> PUT msg 1
> PUT msg 2
< GET msg 1 [waited 0.0s][439.56 reqs/sec]
/Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/consumer.rb:246:in `block in <class:Consumer>': undefined method `handle_delivery' for nil:NilClass (NoMethodError)
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:535:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:535:in `receive_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:514:in `receive_frame'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapters/event_machine.rb:326:in `receive_data'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
from demo-amqp-one-message-subscribers.rb:57:in `<main>'
/Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:244:in `send_frame': Trying to send frame through a closed connection. Frame is #<AMQ::Protocol::MethodFrame:0x007fa6d29a35f0 @payload="\x00<\x00(\x00\x00\x00\x1Ftest.rapid-queue-unsubscription\x02", @channel=1> (AMQ::Client::ConnectionClosedError)
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:261:in `block (2 levels) in send_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:261:in `each'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:261:in `block in send_frameset'
from <internal:prelude>:10:in `synchronize'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/channel.rb:100:in `synchronize'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:260:in `send_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/exchange.rb:152:in `publish'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amqp-0.8.0/lib/amqp/exchange.rb:482:in `block in publish'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/deferrable.rb:47:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/deferrable.rb:47:in `callback'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amqp-0.8.0/lib/amqp/channel.rb:905:in `once_open'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amqp-0.8.0/lib/amqp/exchange.rb:479:in `publish'
from demo-amqp-one-message-subscribers.rb:16:in `block in start_producer'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/timers.rb:51:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/timers.rb:51:in `fire'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
from demo-amqp-one-message-subscribers.rb:45:in `<main>'
> PUT msg 0
< GET msg 0 [waited 0.0s][511.25 reqs/sec]
> PUT msg 1
> PUT msg 2
< GET msg 1 [waited 0.0s][439.56 reqs/sec]
/Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/consumer.rb:246:in `block in <class:Consumer>': undefined method `handle_delivery' for nil:NilClass (NoMethodError)
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:535:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:535:in `receive_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:514:in `receive_frame'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapters/event_machine.rb:326:in `receive_data'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
from demo-amqp-one-message-subscribers.rb:57:in `<main>'
/Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:244:in `send_frame': Trying to send frame through a closed connection. Frame is #<AMQ::Protocol::MethodFrame:0x007fa6d29a35f0 @payload="\x00<\x00(\x00\x00\x00\x1Ftest.rapid-queue-unsubscription\x02", @channel=1> (AMQ::Client::ConnectionClosedError)
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:261:in `block (2 levels) in send_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:261:in `each'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:261:in `block in send_frameset'
from <internal:prelude>:10:in `synchronize'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/channel.rb:100:in `synchronize'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/adapter.rb:260:in `send_frameset'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amq-client-0.8.3/lib/amq/client/async/exchange.rb:152:in `publish'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amqp-0.8.0/lib/amqp/exchange.rb:482:in `block in publish'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/deferrable.rb:47:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/deferrable.rb:47:in `callback'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amqp-0.8.0/lib/amqp/channel.rb:905:in `once_open'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/amqp-0.8.0/lib/amqp/exchange.rb:479:in `publish'
from demo-amqp-one-message-subscribers.rb:16:in `block in start_producer'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/timers.rb:51:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/em/timers.rb:51:in `fire'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
from /Users/rud/.rvm/gems/ruby-1.9.2-head@bundler/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
from demo-amqp-one-message-subscribers.rb:45:in `<main>'
source 'http://rubygems.org'
gem 'amqp'
gem 'eventmachine'
GEM
remote: http://rubygems.org/
specs:
amq-client (0.8.3)
amq-protocol (>= 0.8.0)
eventmachine
amq-protocol (0.8.1)
amqp (0.8.0)
amq-client (~> 0.8.3)
amq-protocol (~> 0.8.0)
eventmachine
eventmachine (0.12.10)
PLATFORMS
ruby
DEPENDENCIES
amqp
eventmachine
OS X 10.7.1
ruby 1.9.2p312 (2011-08-11 revision 32926) [x86_64-darwin11.1.0]
RabbitMQ 2.6.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment