2

ユーザー guest/guest を使用した基本的な RabbitMQ のインストール。

RabbitMQ (erlang クライアント) の次の単純な erlang テスト コードを指定すると、以下のエラーが発生します。キュー TEST_DIRECT_QUEUE が存在し、その中に 7 つのメッセージがあり、RabbitMQ サーバーが稼働しています。

宣言 API コマンドを使用して新規作成しようとすると、同様のエラーが発生します。 全体的に、 << channel:call >> コマンドの実行中にエラーが表示されます

何かご意見は ?ありがとう。

=エラー レポート==== 2013 年 2 月 16 日::10:39:42 ===

接続 (<0.38.0>) の終了: チャネルの内部エラー (<0.50.0>): シャットダウン

** exception exit: {shutdown,{gen_server,call,
                                     [<0.50.0>,
                                      {call,{'queue.declare',0,"TEST_DIRECT_QUEUE",false,false,
                                                             false,false,false,[]},
                                            none,<0.31.0>},
                                      infinity]}}
 in function  gen_server:call/3 (gen_server.erl, line 188)
 in call from test:test_message/0 (test.erl, line 12)

==============================================

-module(test).
-export([test_message/0]).
-include_lib("amqp_client/include/amqp_client.hrl").
-record(state, {channel}).

test_message() ->

    {ok, Connection} = amqp_connection:start(#amqp_params_network{}),
    {ok, Channel} = amqp_connection:open_channel(Connection),
    Get = #'basic.get'{queue = "TEST_DIRECT_QUEUE"},
    {#'basic.get_ok'{}, Content} = amqp_channel:call(Channel, Get),   <=== error here
    #'basic.get_empty'{} = amqp_channel:call(Channel, Get),
    amqp_channel:call(Channel, #'channel.close'{}).
4

1 に答える 1

2

何時間もイライラした後、私は自分で問題を特定しました。全体として、RabbitMQ に関するあいまいなチュートリアルとドキュメントに腹を立てていることを告白させてください.... とにかく、問題は次のとおりです。

1) キュー名はバイナリ形式であると想定されているため、"<<" が前に付き、">>" が上に置かれます。例: <<"my queue name">> (引用符も含まれます)

2) queue.declareでキューを作成しようとしていた別のシナリオでは、キューが既に存在していたという事実は問題ではありませんでしたが、キューが永続的であり、queue.declareがそのセットを指定していなかったという事実パラメータが原因で、プログラムはエラーをスローし、実行を中断しました。これは、通常、開発者が名前だけでキューの照合が行われ、次に進むことを期待する残念な動作です。そのため、耐久性のある値を指定する必要がありました。

これは簡単な作業コードです:

-module(test).
-export([test/0]).
-include_lib("amqp_client/include/amqp_client.hrl").

test() ->
{ok, Connection} = amqp_connection:start(#amqp_params_network{}),
{ok, Channel} = amqp_connection:open_channel(Connection),
Declare = #'queue.declare'{queue = <<"TEST_DIRECT_QUEUE">>, durable = true},
#'queue.declare_ok'{} = amqp_channel:call(Channel, Declare),
Get = #'basic.get'{queue = <<"TEST_DIRECT_QUEUE">>, no_ack = true},
{#'basic.get_ok'{}, Content} = amqp_channel:call(Channel, Get),
#amqp_msg{payload = Payload} = Content.
于 2013-02-17T11:32:46.450 に答える