3

我正在使用红宝石amqp。我运行了一个AMQP.start事件循环,但在循环期间出现了“突然it raised a可能的AuthenticationFailureError”。

  AMQP.start(amqp_config) do |connection|
    channel = AMQP::Channel.new connection
    channel.on_error do |channel, channel_close|
      puts "Oops... a channel-level exception: code = #{channel_close.reply_code}, message = #{channel_close.reply_text}"
    end

    my_worker = MyWorker.new
    my_worker.start
  end

[amqp] Detected TCP connection failure
/home/raincole/.rvm/gems/ruby-1.9.3-p125/gems/amq-client-0.9.3/lib/amq/client/async/adapters/event_machine.rb:164:in `block in initialize': AMQP broker closed TCP connection before authentication succeeded: this usually means authentication failure due to misconfiguration. Settings are {:host=>"localhost", :port=>5672, :user=>"guest", :pass=>"guest", :vhost=>"/", :timeout=>nil, :logging=>false, :ssl=>false, :broker=>nil, :frame_max=>131072} (AMQP::PossibleAuthenticationFailureError)

奇怪的是,我的工人在我收到之前PossibleAuthenticationFailureError收到了一些消息。似乎配置应该是正确的(我一遍又一遍地检查它)。

还有其他潜在的原因PossibleAuthenticationFailureError吗?

4

1 回答 1

8

我建议采用 4 步方法来调查此问题:

a) 消除明显 - 您的凭据是否正确,用户帐户是否有效(默认 = 'guest')?您是否连接到适当的虚拟主机(默认 = '/')?

$ rabbitmqctl list_users

Listing users ...
guest   [administrator]
...done.

$ rabbitmqctl list_user_permissions guest

Listing permissions for user "guest" ...
/   .*  .*  .*
<your_vhost>    .*  .*  .*
...done.


b)rabbitmq 连接日志说什么?

在 Mac OS 上安装 rabbitmq(使用 brew),日志可以在 /usr/local/var/log/rabbitmq 中找到,但您的日志位置可能在其他位置,具体取决于操作系统和安装偏好。

您可能会在 rabbit@localhost.log 文件中看到以下行。没有太多帮助......所以继续步骤(c)。否则,请根据您在日志中看到的内容进行调查。

=INFO REPORT==== 15-Feb-2013::00:42:21 ===
accepting AMQP connection <0.691.0> (127.0.0.1:53108 -> 127.0.0.1:5672)

=WARNING REPORT==== 15-Feb-2013::00:42:21 ===
closing AMQP connection <0.691.0> (127.0.0.1:53108 -> 127.0.0.1:5672):
connection_closed_abruptly


c) rabbitmq 的监听器(Erlang 客户端)是否还活着。默认端口 = 5672。最简单的检查方法是向该端口发送垃圾消息并查找“AMQP”响应:

$ telnet localhost 5672
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
asdasd
AMQP
Connection closed by foreign host.


(d) 在 AMQP.connect(或 AMQP.start)操作有机会完成身份验证之前,事件循环反应器是否过早关闭?

EM.run
  connection = AMQP.connect(:host => 'localhost', :vhost => '/') do
    # your code here
  end
  EM.stop
end

由于所有“您的代码”都位于回调中,EM.stop 在 AMQP.connect 指令之后立即运行。这样就没有时间适当地建立连接。

在这里对我有用的是添加一个计时器并优雅地处理断开连接。

EM.run
  connection = AMQP.connect(:host => 'localhost', :vhost => '/')
    # your code here
  end

  graceful_exit = Proc.new { 
    connection.close { EM.stop }
   }
  EM.add_timer(3, graceful_exit)
end

我将 EM.stop 块放在 Proc 中的原因是我可以将它重用于其他优雅的退出(例如,当捕获“TERM”和“INT”信号时)

希望这可以帮助。

于 2013-02-15T17:10:37.670 回答