当前位置: 首页 > 知识库问答 >
问题:

简单的rabbitmq erlang消息直接队列获取器的奇怪问题

白高超
2023-03-14

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

对于RabbitMQ(erlang client)的以下简单erlang测试代码,我得到了下面的错误。队列TEST_DIRECT_QUEUE已经存在,其中有7条消息,RabbitMQ服务器已经启动并正在运行。

如果我尝试用declare API命令创建一个新的,我也会得到类似的错误。总体而言,该错误将在< >命令期间出现

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

共有1个答案

司寇昱
2023-03-14

经过几个令人沮丧的小时后,我自己已经确定了这个问题。总的来说,让我承认我对关于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.
 类似资料:
  • 我已经使用手动触发器创建了一个azure服务总线和一个新的逻辑应用程序。然后,我将“从队列获取消息(peek lock)”操作添加到应用程序中,并将最大消息数设置为“20”。 然后我在我的队列中手动创建5条新消息,然后触发我的新逻辑应用程序。然后,当我查看应用程序的执行情况时,我只看到检索到一条消息(并检查,有4条消息仍在我的队列中)。 似乎“20”的计数没有得到尊重。我还检查了我的服务总线队列的

  • 问题内容: 我们正在使用amqplib来发布/使用消息。我希望能够读取队列中的消息数(理想情况下是已确认和未确认)。这将使我能够向管理员用户显示良好的状态图,并检测某个组件是否无法满足负载需求。 我在amqplib文档中找不到有关读取队列状态的任何信息。 有人可以指出我正确的方向吗? 问题答案: 使用皮卡: 使用PyRabbit: 使用HTTP 句法: 例: 注意:默认虚拟主机是需要转义为 使用C

  • 主要内容:1 什么是MQ,2 为什么要用 MQ (作用、功能),3 MQ 的分类,4 MQ 的选择1 什么是MQ MQ(message queue),从字面意思来看,本质是一个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。 在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦 + 物理解耦” 的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ ,不用依赖其他服务。 2 为什么要用 MQ (作用、功能)

  • 因此,我使用Spring integration链接JMS和ActiveMQ,如下所示:- 如何使其工作,以便发送到此队列并从中接收消息?请帮忙。

  • 主要内容:1. 什么是消息队列,2. 消息队列有哪些使用场景,3. 消息队列如何解决消息丢失问题,4. 消息队列如何保证消息的顺序性,5. 如何保证数据一致性,事务消息如何实现1. 什么是消息队列 你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下: 我们通常说的消息队列,简称MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafk

  • 问题内容: 正在寻找一种简单的方法(即,不需要我设置单独的服务器来处理消息队列的方法)来对运行计算并生成图形的小型Web界面进行长轮询。这是我的网络界面需要执行的操作: 用户在Web界面中请求图形/数据 服务器运行一些计算。 当服务器运行计算时,将随计算进度更新一个小容器(可能通过AJAX / jQuery)(类似于您在使用consol进行打印时所做的操作(即打印“计算密度函数…”)) 计算完成并