💖 简介
RocketMQ-Client-CPP是Apache RocketMQ的C/C++客户端,是一个具有低延迟、高性能和高可靠性、万亿级容量和灵活可扩展性的分布式消息传递和流平台。
如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹
💖 顺序消息生产者
vi OrderProducer02 .cpp
🏆 代码
#include <iostream>
#include <chrono>
#include <thread>
#include "DefaultMQProducer.h"
#include "MQProducer.h"
using namespace std;
using namespace rocketmq;
class ExampleSelectMessageQueueByHash : public MessageQueueSelector {
public:
MQMessageQueue select(const std::vector<MQMessageQueue> &mqs, const MQMessage &msg, void *arg) {
// 实现自定义分区逻辑,根据业务传入arg参数即分区键,计算路由到哪个队列,这里以arg为int型参数为例。
int orderId = *static_cast<int *>(arg);
int index = orderId % mqs.size();
return mqs[0];
}
};
int main() {
// 初始化消息生产者,并设置生产者组名称
DefaultMQProducer producer("group1");
// 设置服务地址
producer.setNamesrvAddr("192.168.159.5:9876");
// 请确保参数设置完成在启动之前
producer.start();
// 请确保参数设置完成之后启动Producer。
producer.start();
auto start = std::chrono::system_clock::now();
int count = 10;
// 可以设置发送重试的次数,确保发送成功。
int retryTimes = 1;
// 参考接口MessageQueueSelector,通过设置的自定义参数arg,计算发送到指定的路由队列中,此处的arg便是分区ID。
ExampleSelectMessageQueueByHash *pSelector = new ExampleSelectMessageQueueByHash();
for (int i = 0; i < count; ++i) {
// 发送消息时请设置您在阿里云消息队列RocketMQ控制台上申请的Topic。
string MQStr="hello "+to_string(i);
MQMessage msg("topic1", "your tags", "your keys", MQStr);
try {
SendResult sendResult = producer.send(msg, pSelector, &i, retryTimes, false);
std::cout << "SendResult:" << sendResult.getSendStatus() << ", Message ID: " << sendResult.getMsgId()
<< "MessageQueue:" << sendResult.getMessageQueue().toString() << std::endl;
this_thread::sleep_for(chrono::seconds(1));
} catch (MQException e) {
std::cout << "ErrorCode: " << e.GetError() << " Exception:" << e.what() << std::endl;
}
}
auto interval = std::chrono::system_clock::now() - start;
std::cout << "Send " << count << " messages OK, costs "
<< std::chrono::duration_cast<std::chrono::milliseconds>(interval).count() << "ms" << std::endl;
// 资源释放
producer.shutdown();
return 0;
}
🏆 编译
g++ -o ./bin/OrderProducer02 OrderProducer02.cpp -I ./include/ -L./bin/ -lrocketmq -lpthread -lz -ldl -lrt -std=c++11
💖 顺序消息消费者
vi OrderConsumer02.cpp
🏆 代码
#include <iostream>
#include <thread>
#include "DefaultMQPushConsumer.h"
using namespace rocketmq;
/**
* 顺序消息使用顺序类型的topic配置简单的生产者与消费者也可实现顺序消息
* 顺序类型的topic支持全局顺序和局部顺序两类类型
*/
class ExampleOrderlyMessageListener : public MessageListenerOrderly {
public:
ConsumeStatus consumeMessage(const std::vector<MQMessageExt> &msgs) {
for (auto item = msgs.begin(); item != msgs.end(); item++) {
std::cout << "Received Message 主题:" << item->getTopic() << "" << std::endl;
std::cout<<"消息:"<<item->getBody()<<std::endl;
}
// 消费成功返回CONSUME_SUCCESS
return CONSUME_SUCCESS;
}
};
int main() {
// 初始化默认消费者,并设置消费者组名称。
DefaultMQPushConsumer *consumer = new DefaultMQPushConsumer("group11");
// 设置服务地址
consumer->setNamesrvAddr("192.168.159.5:9876");
// 设置用户权限
consumer->setSessionCredentials(
"eyJrZXlJZC......",
"admin",
"");
// 设置命名空间
// consumer->setNameSpace("rocketmq-xxx|namespace_cpp");
consumer->setInstanceName("cppClient");
consumer->setConsumeMessageBatchMaxSize(1);
auto start = std::chrono::system_clock::now();
// 请注册自定义侦听函数用来处理接收到的消息,并返回响应的处理结果。
ExampleOrderlyMessageListener *messageListener = new ExampleOrderlyMessageListener();
// 订阅消息
consumer->subscribe("topic1", "*");
// 注册监听
consumer->registerMessageListener(messageListener);
// 准备工作完成,必须调用启动函数,才可以正常工作。
consumer->start();
// 请保持线程常驻,不要执行shutdown操作。
std::this_thread::sleep_for(std::chrono::seconds(60));
consumer->shutdown();
std::cout << "=======After consuming messages======" << std::endl;
return 0;
}
🏆 编译
g++ -o ./bin/OrderConsumer02 OrderConsumer02.cpp -I ./include/ -L./bin/ -lrocketmq -lpthread -lz -ldl -lrt -std=c++11