请教一个关于librdkafka的问题

coolcpz 2018-03-01 10:23:12
使用librdkafka写了一个consume,消息能够正常接收,但无法使用rd_kafka_topic_opaque获取到设置的用户数据,有没做过的大神,帮忙指导下,感激不尽。

void ConsumeWorkingThread(void* param)
{
if (param) {
CKafkaConsumer* consume = (CKafkaConsumer*)param;
consume->Working();
}
}

void CKafkaConsumer::kafka_msg_consume(rd_kafka_message_t* message, void* opaque) {
if (!message->err) { // 收到正确的消息
/* Real message */
CKafkaMessageNotifyIntf* intf = (CKafkaMessageNotifyIntf*)rd_kafka_topic_opaque(message->rkt);
string name = rd_kafka_topic_name(message->rkt);
if (intf) {
intf->NotifyMessage(rd_kafka_topic_name(message->rkt), static_cast<const char *>(message->payload), message->len);
}
}
else {
switch (message->err) {
case RD_KAFKA_RESP_ERR__TIMED_OUT:
break;

case RD_KAFKA_RESP_ERR__PARTITION_EOF:
break;

default:
std::cerr << "Consume failed: " << rd_kafka_err2str(message->err) << std::endl;
exit_flag = true;
}
}
}

CKafkaConsumer::CKafkaConsumer()
{
kafka_topic_conf = NULL;
kafka_handler = NULL;
kafka_conf = NULL;
exit_flag = false;
}

CKafkaConsumer::~CKafkaConsumer()
{
if (kafka_handler) {
rd_kafka_consumer_close(kafka_handler);
if (topic_list) {
rd_kafka_topic_partition_list_destroy(topic_list);
}
rd_kafka_destroy(kafka_handler);
rd_kafka_wait_destroyed(30000);
}
}

bool CKafkaConsumer::Initialize(const char * brokerlist, const char* group_id, int max_topics)
{
if ((!brokerlist) || (!group_id)) {
return false;
}
char errstr[512] = { 0 };
kafka_conf = rd_kafka_conf_new();
kafka_topic_conf = rd_kafka_topic_conf_new();

// 设置组ID
if (rd_kafka_conf_set(kafka_conf, "group.id", group_id, errstr, sizeof(errstr))) {
return false;
}

if (rd_kafka_topic_conf_set(kafka_topic_conf, "offset.store.method", "broker", errstr, sizeof(errstr))) {
return false;
}

if (rd_kafka_conf_set(kafka_conf, "socket.blocking.max.ms", "20", errstr, sizeof(errstr))) {
return false;
}

rd_kafka_conf_set_default_topic_conf(kafka_conf, kafka_topic_conf);

// 创建kafka句柄
kafka_handler = rd_kafka_new(RD_KAFKA_CONSUMER, kafka_conf, errstr, sizeof(errstr));
if (!kafka_handler) {
return false;
}

// 设置brokerlist
if (rd_kafka_brokers_add(kafka_handler, brokerlist) == 0) {
printf("set broker list failed\n");
return false;
}

rd_kafka_poll_set_consumer(kafka_handler);
topic_list = rd_kafka_topic_partition_list_new(max_topics);
if (!topic_list) {
return false;
}

return true;
}

bool CKafkaConsumer::SubscribeTopic(const char * topic, int partition, int64_t offset, CKafkaMessageNotifyIntf* intf)
{
if (!topic) {
return false;
}

rd_kafka_topic_partition_t * topic_pt = rd_kafka_topic_partition_list_add(topic_list, topic, partition);
if (!topic_pt) {
return false;
}

topic_pt->offset = offset;
topic_pt->opaque = intf;
rd_kafka_resp_err_t err = rd_kafka_subscribe(kafka_handler, topic_list);
if (err) {
printf("订阅消息失败:%s\n", rd_kafka_err2str(err));
return false;
}
return true;
}

bool CKafkaConsumer::SubscribeStart(void)
{
_beginthread(ConsumeWorkingThread, 0, this);
return true;
}

void CKafkaConsumer::Working(void)
{
while (!exit_flag) {
rd_kafka_message_t* message = NULL;
message = rd_kafka_consumer_poll(kafka_handler, 1000);
if (message) {
kafka_msg_consume(message, NULL);
rd_kafka_message_destroy(message);
}
}
}

void CKafkaConsumer::SubscribeStop(void)
{
exit_flag = true;
}
...全文
558 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-01
  • 打赏
  • 举报
回复
百度搜相关关键字。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧