封装C++风格的rdkafka库

本文介绍了如何在C++项目中使用rdkafka库,并对其进行了封装,以提供更简洁的API。通过创建一个包含纯虚函数`handleConsumeCb`的接口,用户可以在消费Kafka消息时自定义处理逻辑。测试代码中,需在编译时链接rdkafka++库,而在实际应用中,需为纯虚函数提供具体实现。
摘要由CSDN通过智能技术生成

项目中用到了kafka,系统是C++开发的,没有现成的可集成API,查阅github,发现有rdkafka,这个C库,挺好用的,但是,他依然不够简洁,因此,对他做了一下封装.

#ifndef _KAFKAMQ_H_
#define _KAFKAMQ_H_

#include <vector>
#include <string>
#include <librdkafka/rdkafkacpp.h>

using namespace std;

class KafkaProducer
{
public:
    KafkaProducer();
    virtual ~KafkaProducer();

public:
    void setBrokers(const string& sBrokers) { m_sBrokers = sBrokers; }

public:
    const vector<string> &getTopicList() const;
    int32_t initialize(const string &sbroker);
    void addTopic(const string& sTopic);
    void pushData2Topic(const string &sTopic, const string sMsg);

private:
    string                          m_sBrokers;
	char*                           m_szBuf;

    RdKafka::Producer*              m_pProducer;
    RdKafka::Conf*                  m_pGlobalConf;
    RdKafka::Conf*                  m_pTopicConf;
    vector<string>                  m_vecTopics;
};


 
class KafkaConsumer
{
public:
    KafkaConsumer();
    virtual ~KafkaConsumer();

public:
    int32_t initializer(const string& sbroker,const string& sGroupId);
    int32_t addTopic(const string& sNewTopic);
    void    addPartitions(const string& sNewTopic);
    int32_t subscribe();

public:
    void work(int32_t iTimeoutMs = 1000);
    virtual void handleConsumeCb(RdKafka::Message *message, void *opaque) = 0;

private:
    string                      m_sBrokers;
    int32_t                     m_iPartition;
    int64_t                     m_iCurrentOffset;
    vector<string>              m_vecTopics;
    string                      m_sGroupId;
    bool                        m_bInit;
    bool                        m_bSub;

    RdKafka::Conf*              m_pGlobalConf;
    RdKafka::Conf*              m_pTopicConf;
    RdKafka::KafkaConsumer*     m_pConsumer;

    std::vector<RdKafka::TopicPartition *> m_vecTopicPartitions;
};

#endif // _KAFKAMQ_H_

上面是他的头文件定义,里面有一个纯虚函数"handleConsumeCb",这是kafka的消费者在接收到要用的数据的时候,按照需求自己去重载,对信息做处理.

#include "KafkaMq.h"
#define     HANDLE_NUM_PER_LOOP     100
#define     MAX_BUFFER_LENGTH       65535


KafkaProducer::KafkaProducer()
    : m_sBrokers()
    , m_pProducer(NULL)
    , m_pGlobalConf(NULL)
    , m_pTopicConf(NULL)
    , m_szBuf(NULL)
{

}

KafkaProducer::~KafkaProducer()
{
    if (m_pGlobalConf)
    {
        delete m_pGlobalConf;
        m_pGlobalConf = NULL;
    }

    if (m_pTopicConf)
    {
        delete m_pTopicConf;
        m_pTopicConf = NULL;
    }

    if (m_pProducer)
    {
        delete m_pProducer;
        m_pProducer = NULL;
    }

    if(m_szBuf)
    {
        delete [] m_szBuf;
        m_szBuf = NULL;
    }
}

int32_t KafkaProducer::initialize(const string &sBroke
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值