3

ルビーのamqp宝石を使用しています。イベントループを実行したのですが、ループ中にAMQP.start突然it raised aPossibleAuthenticationFailureErrorが発生しました。

  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 接続ログは何を示していますか?

rabbitmq の Mac OS インストール (brew を使用) では、ログは /usr/local/var/log/rabbitmq にありますが、OS とインストール設定によっては、ログの場所が別の場所になる場合があります。

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

すべての「コード」がコールバックに置かれているため、AMQP.connect 命令の直後に EM.stop が実行されます。これにより、接続が適切に確立される時間がなくなります。

ここで私にとってうまくいったのは、タイマーを追加して切断を適切に処理することでした。

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 に答える