rocketmq-client-cpp简单使用

本文介绍了Apache RocketMQ的C/C++客户端,详细讲解了其特性,包括同步/异步消息发送、集群/广播消费模式等。通过实例展示了如何编译及使用RocketMQ-Client-CPP,包括生产者和消费者的代码实现,帮助读者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

💖 前言

RocketMQ-Client-CPP是Apache RocketMQ的C/C++客户端,是一个具有低延迟、高性能和高可靠性、万亿级容量和灵活可扩展性的分布式消息传递和流平台。

如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹

💖 下载

https://github.com/apache/rocketmq-client-cpp

💖 特征

  • 同步或异步生成消息,包括正常消息和延迟消息。
  • 在集群或广播模型中,并发或有序地消费消息
  • c 和 c++ 风格的 API。
  • 跨平台,所有功能都支持 Windows、Linux 和 Mac OS。
  • 在生产和消费过程中自动重新平衡。
  • 可靠性,任何停机代理或名称服务器对客户端没有影响。

💖 编译

参考如下:
Linux 下 rocketmq-client-cpp 2.2.0 编译
https://blog.csdn.net/lang523493505/article/details/120823618

💖 简单使用

🏆 生产者

vi synProducer.cpp

#include <iostream>
#include <chrono>
#include <thread>
#include <DefaultMQProducer.h>

using namespace std;
using namespace rocketmq;

/**
 * 同步发送消息
 */
void syncSendMessage();


// 测试main方法
int main() {
    syncSendMessage();
}


/**
 * 初始化消息生产者
 * @return 消息生产者
 */
DefaultMQProducer initProducer() {
    // 初始化消息生产者,并设置生产者组名称
    DefaultMQProducer producer("group1");
    // 设置服务地址
    producer.setNamesrvAddr("192.168.159.5:9876");
    // 请确保参数设置完成在启动之前
    producer.start();
    return producer;
}


void syncSendMessage() {
    // 初始化消息生产者
    DefaultMQProducer producer = initProducer();
    // 记录时间
    auto start = std::chrono::system_clock::now();
    int count = 10;
    for (int i = 0; i < count; ++i) {
        string mess="Hello "+to_string(i);//消息内容
        // 初始化消息内容
        MQMessage msg(
                "topic1",  			//主题
                "TAG",     			//标签
                "keys",
                mess  // 消息内容
        );

        try {
            // 发送消息
            SendResult sendResult = producer.send(msg);
            std::cout << "发送结果:" << sendResult.getSendStatus() << ", 消息ID: " << sendResult.getMsgId()<<"消息: "<<mess<< std::endl;
          
        } catch (MQException e) {
            std::cout << "ErrorCode: " << e.GetError() << " Exception:" << e.what() << std::endl;
        }
    }  
    // 打印发送结果
    std::cout << "成功发送 " << count << " 个消息!"<<std::endl;
    // 释放资源
    producer.shutdown();  
}

编译

g++ -o ./bin/synProducer  synProducer.cpp -I ./include/ -L./bin/ -lrocketmq -lpthread -lz -ldl -lrt -std=c++11

执行

[root@localhost bin]# ./synProducer
发送结果:0, 消息ID: 0100007F0000CD4600004CD9FD7E0100消息: Hello 0
发送结果:0, 消息ID: 0100007F0000CD4600000AE5FD7E0200消息: Hello 1
发送结果:0, 消息ID: 0100007F0000CD4600000DE5FD7E0300消息: Hello 2
发送结果:0, 消息ID: 0100007F0000CD4600000FE5FD7E0400消息: Hello 3
发送结果:0, 消息ID: 0100007F0000CD46000013E5FD7E0500消息: Hello 4
发送结果:0, 消息ID: 0100007F0000CD46000015E5FD7E0600消息: Hello 5
发送结果:0, 消息ID: 0100007F0000CD46000016E5FD7E0700消息: Hello 6
发送结果:0, 消息ID: 0100007F0000CD46000017E5FD7E0800消息: Hello 7
发送结果:0, 消息ID: 0100007F0000CD46000018E5FD7E0900消息: Hello 8
发送结果:0, 消息ID: 0100007F0000CD46000019E5FD7E0A00消息: Hello 9
成功发送 10 个消息!

🏆 消费者

vi synConsumer.cpp

#include <unistd.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "CPushConsumer.h"
#include "CMessageExt.h"

using namespace std;

// 消费消息
int doConsumeMessage(struct CPushConsumer *consumer, CMessageExt *msgExt)
{
    cout << "[收到消息:] " << "消息主题:" << GetMessageTopic(msgExt) << ", 消息标签:" << GetMessageTags(msgExt)
        << ", 消息key值:" << GetMessageKeys(msgExt) << ",消息内容:" << GetMessageBody(msgExt) << endl;

    return E_CONSUME_SUCCESS;
}

int main(int argc, char *argv[])
{
    CPushConsumer *consumer = CreatePushConsumer("group1");
    SetPushConsumerNameServerAddress(consumer, "192.168.159.5:9876");
    Subscribe(consumer, "topic1", "*");
    // 注册消息回调函数
    RegisterMessageCallback(consumer, doConsumeMessage);
    // start push consumer
    StartPushConsumer(consumer);
    cout << "Push consumer start, and listening message within 1min..." << endl;
    for (int i = 0; i < 6; i++)
    {
        cout << "Already Running: " << (i * 10) << "S" << endl;
        usleep(1000);
    }
    // shutdown push consumer
    ShutdownPushConsumer(consumer);
    // destroy push consumer
    DestroyPushConsumer(consumer);
    cout << "PushConsumer Shutdown!" << endl;

    return 0;
}

编译

g++ -o ./bin/synConsumer synConsumer.cpp -I ./include/ -L./bin/ -lrocketmq -lpthread -lz -ldl -lrt -std=c++11

执行

[root@localhost bin]# ./synConsumer
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 3
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 7
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 0
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 4
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 8
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 1
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 5
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 9
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 2
[收到消息:] 消息主题:topic1, 消息标签:TAG, 消息key值:keys,消息内容:Hello 6
Push consumer start, and listening message within 1min...
Already Running: 0S
Already Running: 10S
Already Running: 20S
Already Running: 30S
Already Running: 40S
Already Running: 50S
PushConsumer Shutdown
### C++ 连接 RocketMQ 示例代码及教程 #### 1. 安装依赖库 为了使用 C++ 访问 RocketMQ,需要安装相应的开发库。通常情况下,可以通过包管理器或源码编译来完成这一过程。 ```bash sudo apt-get install librocketmq-dev libpthread-stubs0-dev zlib1g-dev ``` #### 2. 编写生产者示例代码 下面是一个简单C++ 生产者程序,用于向指定的主题发送消息: ```cpp #include <iostream> #include <string> #include <memory> // 导入 RocketMQ 头文件 #include "Producer.h" #include "Message.h" int main() { // 创建 Producer 实例 std::unique_ptr<RocketMQ::DefaultMQProducer> producer( new RocketMQ::DefaultMQProducer("example_group")); try { // 初始化 Producer producer->start(); // 设置 NameServer 地址 producer->setNamesrvAddr("localhost:9876"); for (int i = 0; i < 10; ++i) { // 构建消息对象 auto message = std::make_shared<RocketMQ::Message>("TopicTest", "TagA", ("Hello RocketMQ " + std::to_string(i)).c_str()); // 发送同步消息 RocketMQ::SendResult sendResult = producer->send(message); std::cout << "Send Message: [" << message->getMsgId() << "] Status:" << sendResult.getSendStatus() << std::endl; } // 关闭 Producer producer->shutdown(); } catch (const std::exception& e) { std::cerr << "Exception caught: " << e.what() << std::endl; } } ``` 此段代码展示了如何创建一个 `DefaultMQProducer` 对象,并通过它向名为 `"TopicTest"` 的主题发布多条消息[^2]。 #### 3. 编写消费者示例代码 接下来展示的是一个基本的消费者实现方式,该实例会订阅特定主题的消息并打印出来: ```cpp #include <iostream> #include <memory> // 导入 RocketMQ 头文件 #include "PushConsumer.h" #include "MessageExt.h" class MyListener : public rocketmq::MessageListenerConcurrently { public: virtual ConsumeStatus consumeMessage(std::vector<MQMessageExt>* pList) override { for (auto it = pList->begin(); it != pList->end(); ++it) { printf("Receive New Messages:\n"); printf("msgId=%s \n", (*it).getMsgId().c_str()); printf("body=%.*s\n", static_cast<int>(strlen((*it).getBody())), (*it).getBody()); } return CONSUME_SUCCESS; } }; int main(int argc, char* argv[]) { using namespace rocketmq; DefaultMQPushConsumer consumer("please_rename_unique_group_name_4"); consumer.setNamesrvAddr("localhost:9876"); consumer.subscribe("TopicTest", "*"); consumer.registerMessageListener(MyListener()); consumer.start(); std::cout << "Press any key to exit..." << std::endl; getchar(); consumer.shutdown(); return 0; } ``` 这段代码定义了一个自定义监听器类继承自 `MessageListenerConcurrently` 接口,在其中实现了具体的消费逻辑;之后设置消费者的名称服务器地址以及要订阅的主题名,并启动消费者服务等待接收新消息。 #### 4. 编译与执行 确保已经正确设置了环境变量 PATH 和 LD_LIBRARY_PATH 后,可以按照如下命令来进行编译链接操作: ```bash g++ -o cpp_producer_example cpp_producer_example.cpp -lrocketmq -lpthread -lz -ldl -lrt ./cpp_producer_example ``` 同样的方法也适用于编译消费者端的应用程序[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值