2

带有用户 guest/guest 的基本 RabbitMQ 安装。

给定以下 RabbitMQ(erlang 客户端)的简单 erlang 测试代码,我收到以下错误。队列 TEST_DIRECT_QUEUE 存在,其中有 7 条消息,并且 RabbitMQ 服务器已启动并运行。

如果我尝试使用 declare 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) 队列名称应该是二进制形式,因此以“<<”开头并由“>>”取代。例如:<<"我的队列名称">>(也包括引号)

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 回答