我正在使用 ruby​​ amqp gem。我运行了一个 AMQP.start 事件循环,但在循环期间“突然出现了 it raised a 可能的认证失败错误”。

  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 步方法来调查此问题:

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 连接日志说什么?

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

您可能会在 [email protected] 文件中看到以下几行。没有太多帮助......所以继续步骤(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)操作有机会完成身份验证之前,事件循环 react 器是否过早关闭?
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' 信号时)

希望这可以帮助。

关于ruby - amqp 中突然出现可能的身份验证失败错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11637998/

10-12 15:58