我正在使用 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/