amqp中突然发生PossibleAuthenticationFailureError

Lai*_*uan 3 ruby amqp

我正在使用红宝石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吗?

cha*_*ows 8

我建议采用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'信号时)

希望这可以帮助.