Ruby 为什么rabbitmq会丢失消息?

Ruby 为什么rabbitmq会丢失消息?,ruby,rabbitmq,amqp,Ruby,Rabbitmq,Amqp,我首先使用send.rb将100条消息发送到rabbitmq,然后使用rabbitmqctl list_队列查看状态,队列中有100条消息。然后我启动recv.rb到recv message,实际上我收到了100条消息 然后,我先启动recv.rb,然后使用send.rb发送100条消息,最后我只能收到95条消息。我试了很多次,但在这种情况下我从来没有收到100条信息 为什么我会丢失信息 recv.rb require 'amqp' AMQP.start(:host => '127.0.

我首先使用send.rb将100条消息发送到rabbitmq,然后使用
rabbitmqctl list_队列
查看状态,队列中有100条消息。然后我启动recv.rb到recv message,实际上我收到了100条消息

然后,我先启动recv.rb,然后使用send.rb发送100条消息,最后我只能收到95条消息。我试了很多次,但在这种情况下我从来没有收到100条信息

为什么我会丢失信息

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
如果我将行替换为

    EM.add_timer(body.count(".")) do
      puts " [x] Done"
      header.ack
    end
与rabbitmq教程相同,此脚本崩溃:

 /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>'
/usr/local/lib/ruby/gems/1.9.1/gems/amq-client-0.9.10/lib/amq/client/async/adapter.rb:247:在“发送框架”中:尝试通过闭合连接发送框架。框架为#(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:在“确认”中
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'
摘自recv.rb:22:in‘block(3层)in’
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'
从recv.rb:5:in`'

这意味着您正试图通过已关闭的连接进行发布。请在RabbitMQ日志中发布您用于发布的脚本以及您最近收到的任何消息。

您是否也可以发布send.rb?仅从画面的一面很难诊断出这一点。