librdkafak消费者 最小c语言版本
来源:互联网 发布:java快速开发平台 开源 编辑:程序博客网 时间:2024/06/11 20:50
这是我自己看的librdkafka的样例代码整理来的,去掉很多修饰的代码
#include <ctype.h>#include <signal.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <syslog.h>#include <time.h>#include <sys/time.h>#include <getopt.h>#include <librdkafka/rdkafka.h>static int run = 1;static rd_kafka_t *rk;static void stop(int sig) { run = 0; fclose(stdin); /* abort fgets() */}static void sig_usr1 (int sig) { rd_kafka_dump(stdout, rk);}static void logger (const rd_kafka_t *rk, int level, const char *fac, const char *buf) { struct timeval tv; gettimeofday(&tv, NULL); fprintf(stderr, "%u.%03u RDKAFKA-%i-%s: %s: %s\n", (int)tv.tv_sec, (int)(tv.tv_usec / 1000), level, fac, rk ? rd_kafka_name(rk) : NULL, buf);}static void msg_consume (rd_kafka_message_t *rkmessage, void *opaque) { if (rkmessage->err) { if (rkmessage->err == RD_KAFKA_RESP_ERR__PARTITION_EOF) { fprintf(stderr, "%% Consumer reached end of %s [%d] message queue at offset %ld\n", rd_kafka_topic_name(rkmessage->rkt), rkmessage->partition, rkmessage->offset); run--; return; } return; } fprintf(stderr, "offset=%d, len=%d, content=%s\n", rkmessage->offset, rkmessage->len, rkmessage->payload);}int main (int argc, char **argv) { rd_kafka_topic_t *rkt; char *brokers = "192.168.1.103:9092"; char mode = 'C'; char *topic = "rtb"; int partition = 1; int opt; int parti; //循环partition rd_kafka_conf_t *conf; rd_kafka_topic_conf_t *topic_conf; char errstr[512]; int64_t start_offset = 0; char tmp[16]; int64_t seek_offset = 0; conf = rd_kafka_conf_new(); rd_kafka_conf_set_log_cb(conf, logger); snprintf(tmp, sizeof(tmp), "%i", SIGIO); rd_kafka_conf_set(conf, "internal.termination.signal", tmp, NULL, 0); topic_conf = rd_kafka_topic_conf_new(); while ((opt = getopt(argc, argv, "p:s:")) != -1) { switch (opt) { case 'p': partition = strtoll(optarg, NULL, 10); run = partition; break; case 's': seek_offset = strtoll(optarg, NULL, 10); break; default: break; } } signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); //Consumer if (mode == 'C') { /* Create Kafka handle */ if (!(rk = rd_kafka_new(RD_KAFKA_CONSUMER, conf, errstr, sizeof(errstr)))) { fprintf(stderr, "%% Failed to create new consumer: %s\n", errstr); exit(1); } /* Add brokers */ if (rd_kafka_brokers_add(rk, brokers) == 0) { fprintf(stderr, "%% No valid brokers specified\n"); exit(1); } /* Create topic */ rkt = rd_kafka_topic_new(rk, topic, topic_conf); topic_conf = NULL; /* Now owned by topic */ for(parti = 0; parti < partition; parti++) { /* Start consuming */ if (rd_kafka_consume_start(rkt, parti, start_offset) == -1){ rd_kafka_resp_err_t err = rd_kafka_last_error(); fprintf(stderr, "%% Failed to start consuming: %s\n", rd_kafka_err2str(err)); if (err == RD_KAFKA_RESP_ERR__INVALID_ARG) fprintf(stderr, "%% Broker based offset storage requires a group.id, add: -X group.id=yourGroup\n"); exit(1); } while (run > 0) { rd_kafka_message_t *rkmessage; rd_kafka_resp_err_t err; if (seek_offset) { err = rd_kafka_seek(rkt, parti, seek_offset, 2000); if (err) printf("Seek failed: %s\n", rd_kafka_err2str(err)); else printf("Seeked to %ld\n", seek_offset); seek_offset = 0; } rd_kafka_poll(rk, 0); rkmessage = rd_kafka_consume(rkt, parti, 1000); if (! rkmessage) /* timeout */ continue; msg_consume(rkmessage, NULL); rd_kafka_message_destroy(rkmessage); } rd_kafka_consume_stop(rkt, parti); while (rd_kafka_outq_len(rk) > 0) rd_kafka_poll(rk, 10); } /* Destroy topic */ rd_kafka_topic_destroy(rkt); /* Destroy handle */ rd_kafka_destroy(rk); } if (topic_conf) rd_kafka_topic_conf_destroy(topic_conf); /* Let background threads clean up and terminate cleanly. */ run = 5; while (run-- > 0 && rd_kafka_wait_destroyed(1000) == -1) printf("Waiting for librdkafka to decommission\n"); if (run <= 0) rd_kafka_dump(stdout, rk); return 0;}
all:gcc -g *.c -o consumer -lrdkafka -lpthread -lrt -lsslclean:rm -rf consumer
阅读全文
0 0
- librdkafak消费者 最小c语言版本
- 实现一个通用的生产者消费者队列(c语言版本)
- 生产者与消费者C语言,Java语言
- C语言最小堆
- c语言描述生产者消费者问题
- C语言实现生产者-消费者问题
- 生产者消费者问题---C语言实现
- C语言生产者与消费者-随机数实现
- linux下c语言生产者消费者问题
- 生产者-消费者问题及C语言实现
- C语言之生产者与消费者模型
- C语言版本
- C语言版本历史
- C语言 最小生成树
- C语言 最小生成树
- C语言的标准版本
- POJ 1000 C语言版本
- C语言版本--工资管理系统
- 秒懂5G!通俗易懂外行也能看明白
- USB总线工作原理
- 王爽汇编语言实验10.3
- 数据结构--链表
- 窗口绘制的知识汇总
- librdkafak消费者 最小c语言版本
- socket通信服务端编程
- 算法学习之:动态树(link-cut-tree)及bzoj3282Tree例题详解
- CSS3笔记——转换
- redis配置后端启动——支持集群部署
- 欢迎使用CSDN-markdown编辑器
- XTU C语言程序设计实践作业2
- C#基础-056 字符串练习题
- return的用法是什么?若用在for循环中,还会执行下一次循环吗?