简单的rabbitmq erlang消息直接队列getter的奇怪问题

时间:2013-02-16 16:58:26

标签: erlang rabbitmq

使用guest guest / guest进行基本的RabbitMQ安装。

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

如果我尝试使用声明API命令创建新的,我会收到类似的错误。 总体而言,错误出现在任何<<频道:来电>>命令

有什么想法?感谢。

=错误报告==== 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)

============================================== < / p>

-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'{}).

1 个答案:

答案 0 :(得分:2)

经过一段令人沮丧的时间后,我自己发现了这个问题。总的来说,让我承认对于关于RabbitMQ的模糊的指导和文档感到不满......无论如何,这就是问题所在:

1)队列名称应该是二进制形式,因此前面是“&lt;&lt;”并由“&gt;&gt;”取代。例如:&lt;&lt;“我的队列名称”&gt;&gt; (也包括引号)

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.