SimpleAmqpClient Channel :: basicConsume(),如何从RabbitMQ中获取所有消息

时间:2018-02-21 12:22:23

标签: c++ rabbitmq

这是一个非常基本的问题,我将把这一部分分成两部分

用例: 我正在编写一个c ++应用程序,需要与运行在服务器上的RabbitMQ进行通信。目前,我能够在队列上发布消息并消耗队列中的消息(如果队列中有n条消息,则只消耗一条消息)。

我可以从basicConsume()方法的描述中读到 “开始在队列中使用基本消息  订阅作为队列的使用者,以及队列中的所有未来消息  将是Basic.Delivered“

所以每当我在队列中执行basicConsume()时,我的所有消息都会传递给我(在服务器上我的队列是空的),

我正在做类似

的事情
#include <SimpleAmqpClient/SimpleAmqpClient.h>
#include<iostream>
#include<string>
using namespace std;
using namespace AmqpClient;


int main()
{
    Channel::ptr_t connection = Channel::Create("ip",5672,usename,password);

    const std::string body("Test Message3");
    BasicMessage::ptr_t out_message = BasicMessage::Create(body);
//code to publish , works fine 
//connection->BasicPublish("exchange", "key",BasicMessage::Create("Message1"));

//BasicConsume say we have 5 messages in my queue
string consumer_tag=connection->BasicConsume("queue","");

Envelope::ptr_t envelope = connection->BasicConsumeMessage(consumer_tag);
        connection->BasicAck(envelope->GetDeliveryInfo());
        BasicMessage::ptr_t bodyBasicMessage=envelope->Message();
        string messageBody=bodyBasicMessage->Body();
        cout<<"message  body : "<<messageBody<<endl;
}

我只能读取队列中的第一条消息。

问题:

  1. 如何让C ++使用者不断收听我的队列以及每当有消息应用程序消耗它时(托管c ++应用程序/使用线程/使用无限循环)我没有任何线程经验或托管c ++应用程序(目前我只限于可执行文件)所以任何建议的读取都是最受欢迎的。
  2. 如何阅读其余4条被删除的邮件。
  3. 非常感谢提前。

2 个答案:

答案 0 :(得分:0)

RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题。

根据以下问题,您必须通过致电BasicConsumeMessage来消费每条消息 -  https://github.com/alanxz/SimpleAmqpClient/issues/162

此库不支持异步回调。

答案 1 :(得分:0)

谢谢@Luke的回复。 我解决了通过执行以下操作来删除邮件的问题 BasicAonsume,noAck设置为false - &gt; BasicConsumeMessage在一个无限循环内,后跟一个basicAck() 通过执行此操作,我的应用程序等待从队列中消耗(当队列中没有消息时不会中断)并且队列不会向我发送下一条消息,直到它收到第一条消息的ACK。

现在我打算将它作为守护进程,因此关闭终端不会影响执行。

欢迎任何其他建议。