Linux下librdkafka客户端的编译运行
Linux下librdkafka客户端的编译运行
librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者、消费者接口。
由于项目需要,我要将Kafka生产者接口封装起来给别人调用,所以先安装了librdkakfa,然后在demo上进行修改封装一个生产者接口。
[一] 安装librdkafka
首先在github上下载librdkafka源码,解压后进行编译;
cd librdkafka-master
chmod 777 configure lds-gen.py
./configure
make
make install
在make的时候,如果是64位Linux会报下面这个异常
/bin/ld:librdkafka.lds:1: syntax error in VERSION script
只要Makefile.config里面的WITH_LDS=y这一行注释掉就不会报错了。
[二] 封装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 "librdkafka/rdkafka.h" /* for Kafka driver */ static int run = ;
static rd_kafka_t *rk;
rd_kafka_topic_t *rkt;
int partition = RD_KAFKA_PARTITION_UA;
rd_kafka_topic_conf_t *topic_conf; static void stop (int sig) {
run = ;
fclose(stdin); /* abort fgets() */
} static void sig_usr1 (int sig) {
rd_kafka_dump(stdout, rk);
} int initProducer (char *parameters) {
int argc = ;
char **argv;
char *para;
char *delim = " ";
char *brokers = "localhost:9092";
char *topic = NULL;
int opt;
rd_kafka_conf_t *conf;
char errstr[];
char tmp[]; char copyParameters[];
strcpy(copyParameters, parameters);
para = strtok(parameters, delim);
argc++;
while((para = strtok(NULL, delim)) != NULL){
argc++;
}
argv = (char**)malloc(argc*sizeof(char*));
argc = ;
argv[argc] = "initProducer";
para = strtok(copyParameters, delim);
argc++;
argv[argc] = para;
while((para = strtok(NULL, delim)) != NULL){
argc++;
argv[argc] = para;
}
argc++;
/* Kafka configuration */
conf = rd_kafka_conf_new();
/* Quick termination */
snprintf(tmp, sizeof(tmp), "%i", SIGIO);
rd_kafka_conf_set(conf, "internal.termination.signal", tmp, NULL, );
/* Topic configuration */
topic_conf = rd_kafka_topic_conf_new();
while ((opt = getopt(argc, argv, "PCLt:p:b:z:qd:o:eX:As:")) != -) {
switch (opt) {
case 't':
topic = optarg;
break;
case 'p':
partition = atoi(optarg);
break;
case 'b':
brokers = optarg;
break;
default:
fprintf(stderr, "%% Failed to init producer with error parameters\n");
}
}
if (optind != argc || !topic) {
exit();
}
signal(SIGINT, stop);
signal(SIGUSR1, sig_usr1);
/* Create Kafka handle */
if (!(rk = rd_kafka_new(RD_KAFKA_PRODUCER, conf, errstr, sizeof(errstr)))) {
fprintf(stderr, "%% Failed to create new producer: %s\n", errstr);
exit();
}
rd_kafka_set_log_level(rk, LOG_DEBUG);
/* Add brokers */
if (rd_kafka_brokers_add(rk, brokers) == ) {
fprintf(stderr, "%% No valid brokers specified\n");
exit();
}
/* Create topic */
rkt = rd_kafka_topic_new(rk, topic, topic_conf);
topic_conf = NULL; /* Now owned by topic */
return ;
} int freeProducer()
{
/* Destroy topic */
rd_kafka_topic_destroy(rkt);
/* Destroy the handle */
rd_kafka_destroy(rk);
if (topic_conf)
rd_kafka_topic_conf_destroy(topic_conf);
/* Let background threads clean up and terminate cleanly. */
run = ;
while (run-- > && rd_kafka_wait_destroyed() == -)
printf("Waiting for librdkafka to decommission\n");
if (run <= )
rd_kafka_dump(stdout, rk);
return ;
} int main (int argc, char **argv)
{
char parameter[] = "-t XX-HTTP-KEYWORD-LOG -b 10.10.6.101:9092,10.10.6.102:9092,10.10.6.104:9092";
char buf[];
initProducer(parameter);
while (run && fgets(buf, sizeof(buf), stdin)) {
if(rd_kafka_produce(rkt, partition, RD_KAFKA_MSG_F_COPY, buf, strlen(buf), NULL, , NULL) == -){
fprintf(stderr, "%% Failed to produce to topic %s partition %i: %s\n", rd_kafka_topic_name(rkt), partition, rd_kafka_err2str(rd_kafka_last_error()));
}else{
fprintf(stderr, "%% Sent %zd bytes to topic %s partition %i\n", strlen(buf), rd_kafka_topic_name(rkt), partition);
}
}
freeProducer();
return ;
}
[三] 编译运行
编译的时候要加上-lrdkafka -lz -lpthread -lrt这些选项:gcc myProducer.c -o myProducer -lrdkafka -lz -lpthread -lrt
在编译的时候会报error while loading share library librdkafak.so.1,这是因为make的时候将librdkafak.so.1放在了/usr/local/lib下,在Linux的默认共享库路径/lib和/usr/lib下找不到,只要执行下面两句就可以了:
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
运行./myProducer,会不断的从终端读取键入的字符串,然后发送到Kafka,通过Kafka自带的console consumer能够消费查看数据。
Linux下librdkafka客户端的编译运行的更多相关文章
- [转]Caffe在Linux下的安装,编译,实验
Caffe在Linux下的安装,编译,实验 原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- Linux下 SpringBoot jar项目后台运行、查看、停用
运行java jar: nohup java -jar **-0.0.1-SNAPSHOT.jar & 查看进程: 采用top或者ps aux命令.一般 如果后台是springboot,jar ...
- Linux下FFmpeg的安装编译过程【转】
本文转载自:http://www.linuxidc.com/Linux/2013-06/85628.htm 详细说下在Linux下FFmpeg的安装编译过程.参考 Ubuntu 10.04安装编译FF ...
- linux和Windows下用sublime text3编译运行C,C++
安装MinGW 1.首先安装MinGW,默认安装位置是C:\MinGW. 2.安装完成后,右键“我的电脑”->属性 ->高级->环境变量,在系统环境变量PATH里添加C:\MinGW ...
- Linux下通过源码编译安装程序
本文简单的记录了下,在linux下如何通过源码安装程序,以及相关的知识.(大神勿喷^_^) 一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件: ...
- linux下motion摄像头监控编译与配置
利用linxu下的开源的motion搭建嵌入式视频动态监控系统 所谓移动图像监测,简单来说就是利用摄像头定点监测某个区域,当有移动物体经过时,摄像头便自动抓拍(要监测多大物体.按拍照速率都是可调的), ...
- Linux下C++/C的编译调试
这几天因为任务的原因我需要在ubuntu下编写程序.因此恶补了许多linux程序编写的知识.我分以下几个方面总结我所学的知识. gcc,g++,make命令的使用 gdb 调试 VScode的使用 c ...
- 在linux下用命令行编译 java的eclipse项目
由于jdk的版本问题导致在windows上编译打包好的jar包放在linux服务器上运行的时候出现一点小异常,所以决定在linux上进行一次项目编译,这有两个选择1.在相同的linux环境下安装lin ...
随机推荐
- Velocity是如何工作的
当在一个应用程序或者servlet中使用Velocity的时候,你要做如下几个工作: 初始化Velocity.Velocity提供2种使用形式,不管是单一实例模式还是单独运行实例模式,初始化过程都只做 ...
- error: Setup script exited with error: Unable to find vcvarsall.bat
安装mxnet python版本时遇到“Unable to find vcvarsall.bat”错误搜索一下后查到如下方法: python 3.5.2版本依赖高版本的vs解决办法是安装vs2015的 ...
- grails2.3.11第一课
以指令的方式Getting Started 1. 创建一个项目 grails create-app HelloGrails 2. 因为我环境变量中配置的jdk是1.8的,所以我要把这个项目搞到IDEA ...
- 问题-在TreeView使用时,发现选中的树节点会闪烁或消失
问题:在工程中选中一个树节点,鼠标焦点在树上,做某种操作时发现选中的点会消失?原因:如果只是BeginUpdate后,没有调用EndUpdate,树会全空.应该是BeginUpdate方法会刷新树,但 ...
- Delphi 调用netsh命令修改IP地址
Delphi 调用netsh命令修改IP地址 先介绍一下Netsh命令的使用方法: 在这里跟大家介绍几个简单的指令 1.Show IP 1.1Cmd Mode 直接在cmd下面输入 netsh int ...
- ACCESS-字符函数
mid:等于delphi中的COPY举例str="123456"mid(str,2,1)的意思是在str字符串中从第2个字符开始取得一个字符,结果为2注意:下标是从1开始,而不是从 ...
- MAX16054
MAX16054是带有单个开关去抖以及内部闭锁电路的按键通/断控制器,可接受机械开关产生的嘈杂输入,并经过一个有工厂设置的延迟时间后产生干净的数字锁存输出. 开关通.断期间,MAX16054无接触抖动 ...
- [OC Foundation框架 - 6] NSMutableString
NSString是不可变的 NSMutableString是可变字符串 1.初始化 2.串联字符串 3.替换字符串 4.插入字符串 5.删除字符串 #pragma mark buffer st ...
- Java与MySql数据类型对照表
类型名称 显示长度 数据库类型 JAVA类型 VARCHAR L+N VARCHAR java.lang.String CHAR N CHAR java.lang.String BLOB L+N BL ...
- SQL 正则表达式使模式匹配和数据提取变得更容易
SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易 David Banister 本文讨论: 使用正则表达式进行高效的 SQL 查询 SQL Server 2005 对正则表达式 ...