我正在使用红宝石amqp宝石.我运行了一个AMQP.start事件循环,但it raised a在循环期间"突然发生了PossibleAuthenticationFailureError".
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)
Run Code Online (Sandbox Code Playgroud)
怪异的部分是,我的工作人员已经收到一些消息之前,我得到了PossibleAuthenticationFailureError.看起来配置应该是正确的(我一遍又一遍地检查).
还有其他潜在的原因PossibleAuthenticationFailureError吗?
我建议采用4步法来调查此问题:
a)消除明显的 - 您的凭据是否正确并且用户帐户是否还活得很好(默认='来宾')?您是否连接到相应的vhost(默认='/')?
$ rabbitmqctl list_users
Listing users ...
guest [administrator]
...done.
$ rabbitmqctl list_user_permissions guest
Listing permissions for user "guest" ...
/ .* .* .*
<your_vhost> .* .* .*
...done.
Run Code Online (Sandbox Code Playgroud)
b)rabbitmq连接日志说什么?
在Mac OS安装的RabbitMQ(使用BREW)的,日志可以在/ usr /本地的/ var /日志/ 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
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
(d)在AMQP.connect(或AMQP.start)操作有机会完成身份验证之前,事件循环反应器是否过早关闭?
EM.run
connection = AMQP.connect(:host => 'localhost', :vhost => '/') do
# your code here
end
EM.stop
end
Run Code Online (Sandbox Code Playgroud)
当所有"你的代码"都在回调中时,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
Run Code Online (Sandbox Code Playgroud)
我把EM.stop块放在Proc中的原因是我可以将它重用于其他优雅的出口(比如,当捕获'TERM'和'INT'信号时)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
1711 次 |
| 最近记录: |