rocketmq-client-cpp实现顺序消息

在这里插入图片描述

💖 简介

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值