J'utilise d'abord send.rb pour envoyer 100 messages à rabbitmq, puis j'utilise rabbitmqctl list_queues
pour voir l'état, et il y a 100 messages dans la file d'attente. Ensuite, je commence recv.rb à message de recv, et je reçois en fait 100 messages.Pourquoi rabbitmq a perdu des messages?
Ensuite, je commence recv.rb d'abord, puis utiliser send.rb pour envoyer 100 messages, enfin je ne peux recevoir que 95 messages. J'ai essayé plusieurs fois, et je n'ai jamais reçu 100 messages dans cette situation.
Pourquoi j'ai perdu des messages?
recv.rb
require 'amqp'
AMQP.start(:host => '127.0.0.1') do |connection|
channel = AMQP::Channel.new(connection)
queue = channel.queue("test_queue", :durable => true)
Signal.trap("INT") do
connection.close do
EM.stop { exit }
end
end
channel.prefetch(1)
queue.subscribe(:ack => true) do |header, body|
puts body
header.ack # A
end
end
Si je remplace la ligne # A
dans
EM.add_timer(body.count(".")) do
puts " [x] Done"
header.ack
end
les mêmes que RabbitMQ-tutoriels, ce script se bloque:
/usr/local/lib/ruby/gems/1.9.1/gems/amq-client-0.9.10/lib/amq/client/async/adapter.rb:247:in `send_frame': Trying to send frame through a closed connection. Frame is #<AMQ::Protocol::MethodFrame:0x000000019dc6e0 @payload="\x00<\x00P\x00\x00\x00\x00\x00\x00\x00\x03\x00", @channel=2> (AMQ::Client::ConnectionClosedError)
from /usr/local/lib/ruby/gems/1.9.1/gems/amq-client-0.9.10/lib/amq/client/async/channel.rb:138:in `acknowledge'
from /usr/local/lib/ruby/gems/1.9.1/gems/amqp-0.9.8/lib/amqp/channel.rb:1003:in `acknowledge'
from /usr/local/lib/ruby/gems/1.9.1/gems/amqp-0.9.8/lib/amqp/header.rb:35:in `ack'
from recv.rb:22:in `block (3 levels) in <main>'
from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `call'
from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run_machine'
from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run'
from /usr/local/lib/ruby/gems/1.9.1/gems/amqp-0.9.8/lib/amqp/connection.rb:38:in `start'
from recv.rb:5:in `<main>'
Pourriez-vous également nous envoyer votre fichier send.rb? Il est difficile de diagnostiquer cette vision d'un seul côté de l'image. – charleyc