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 ...
随机推荐
- HDU 1561-The more, The Better(树状背包)
题意: n个城堡,每个有一定的财富,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡,求应攻克哪m个城堡,获得最大财富. 分析:dp[i][j],以i为根的子树,攻克j个城堡,获得的 ...
- (原创)win7自带IIS7.5+php7.0.10安装教程(图)
php在上周8月18日发布了PHP 7.0 (7.0.10)版本.详细下载页面http://windows.php.net/download/,根据自身电脑配置情况酌情下载版本.win7旗舰版,iis ...
- MFC消息映射机制
1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...
- 山东省2016acm省赛
A 水 #include <iostream> #include <cstdio> #include <algorithm> #include <list&g ...
- ubuntu下PHP支持cURL
公司项目需要,注册需要验证手机号码,其中需要LAMP支持cURL.由于事先安装平台的时候,并没有注意到这一点,所以编译PHP5的时候,并没有使用参数--with-curl.后来需要的时候,查一些参考方 ...
- iOS CAShapeLayer精讲
前言 CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性.但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义. 关于UIBezierPath,请阅读文章:i ...
- Linq使用之标准运算符方法
#region linq的标准查询运算符(即lambda方式) 注:C#不支持标准查询运算符中带有整形参数(索引)的重载 // 1.标准查询运算符之筛选方法——where //I ...
- React Native学习笔记-1:JSC profiler is not supported.(转载)
运行react-native中Example下的UIEXPLORER Project 遇到虾面报错: 2016-03-21 14:12:18.941 [trace][tid:com.facebook. ...
- H5页面请求跨域问题
1. <meta http-equiv="Access-Control-Allow-Origin" content="*"> 说明一下什么情况下我 ...
- 使用 StoryBoard 的时候加入用户引导页面
如果想让一个APP加上引导页面是一个非常完美的举动 但是,总会遇到一些问题 (不要忘记在APDelegate里面加上用户引导页面的头文件和程序启动时的第一个页面哦) 情况一:纯代码 判断是否是第一次启 ...