这是一个非常基本的问题,我将把这一部分分成两部分
用例: 我正在编写一个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;
}
我只能读取队列中的第一条消息。
问题:
非常感谢提前。
答案 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。
现在我打算将它作为守护进程,因此关闭终端不会影响执行。
欢迎任何其他建议。