libnsq编译、使用记录
官方介绍libnsq是nsq的c库,尼玛还真是c库,如果用g++编译还真编译不过。这篇文章就是说一下怎么在c++中使用libnsq。
为什么用g++编译不过libnsq呢,因为其头文件中默认全是c函数,没有对c++编译器做处理。
为了保持libnsq的完整性,不对libnsq代码作任何修改。
libnsq默认编译输出libnsq.a,个人不太喜欢使用静态库,所以自行编译为动态库:
gcc -o libnsq.so command.c http.c json.c message.c nsqd_connection.c nsqlookupd.c reader.c -fPIC -shared -lev -levbuffsock -lcurl -ljson-c
随后封装了c调研libnsq,代码如下
brd_nsq_consumer.h
#ifndef __BRD_NSQ_CONSUMER_H__
#define __BRD_NSQ_CONSUMER_H__
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*HANDLER)(const char *msg);
HANDLER callback;
void init_nsq_consumer(const char *topic,const char *channel,const char *nsqlookupdDomain,int nsqlookupdPort,HANDLER handle);
#ifdef __cplusplus
}
#endif
#endif
brd_nsq_consumer.c
#include "brd_nsq_consumer.h"
#include "nsq.h"
void message_handler(struct NSQReader *rdr, struct NSQDConnection *conn, struct NSQMessage *msg, void *ctx);
void init_nsq_consumer(const char *topic,const char *channel,const char *nsqlookupdDomain,int nsqlookupdPort,HANDLER handle)
{
callback = handle;
struct NSQReader *rdr;
struct ev_loop *loop;
void *ctx = NULL; //(void *)(new TestNsqMsgContext());
loop = ev_default_loop(0);
rdr = new_nsq_reader(loop, topic, channel, (void *)ctx,
NULL, NULL, NULL, message_handler);
nsq_reader_connect_to_nsqd(rdr, "127.0.0.1", 4150);
//nsq_reader_add_nsqlookupd_endpoint(rdr, nsqlookupdDomain, 4161);
nsq_run(loop);
}
void message_handler(struct NSQReader *rdr, struct NSQDConnection *conn, struct NSQMessage *msg, void *ctx)
{
if(callback!=NULL)
callback(msg->body);
buffer_reset(conn->command_buf);
nsq_finish(conn->command_buf, msg->id);
buffered_socket_write_buffer(conn->bs, conn->command_buf);
buffer_reset(conn->command_buf);
nsq_ready(conn->command_buf, rdr->max_in_flight);
buffered_socket_write_buffer(conn->bs, conn->command_buf);
free_nsq_message(msg);
}
编译:
gcc -shared -fPIC -o libnsqconsumer.so brd_nsq_consumer.c -lnsq
然后在c++中调用,代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "brd_nsq_consumer.h"
class CMainModule
{
public:
CMainModule();
~CMainModule();
static void handler(const char *msg);
int procMSg(const char *msg);
};
static CMainModule *g_pModule;
int main()
{
CMainModule *pModule = new CMainModule;
g_pModule=pModule;
init_nsq_consumer("test","ch","127.0.0.1",4161,CMainModule::handler);
sleep(1000);
delete pModule;
}
CMainModule::CMainModule(){
}
CMainModule::~CMainModule(){
}
void CMainModule::handler(const char *msg){
g_pModule->procMSg(msg);
}
int CMainModule::procMSg(const char *msg){
printf("====main=========%s\n",msg );
return 0;
}
编译:
g++ main.cpp -o a.out -lnsqconsumer -L./
libnsq编译、使用记录的更多相关文章
- mysql5.7.10 源码编译安装记录 (centos6.4)【转】
一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...
- win10--vs2015--libjpeg--64位库的编译过程记录
win10--vs2015--libjpeg--64位库的编译过程记录 1. 下载源代码: http://libjpeg.sourceforge.net/ 或者 http://www.ij ...
- maven ssm 编译异常记录:
maven ssm 编译异常记录: javax.servlet.jsp 解决: 清除 tomacat libraries 修改 pom 文件 <dependency> <groupI ...
- OpenSift源代码编译过程记录
本文记录了在CentOS6.5上编译Sift的开源实现OpenSift的编译过程,同一时候记录了编译过程中的几个问题. sift的理论已经有非常多了,以下会给出链接: 1.Requirements a ...
- 使用SSD目标检测c++接口编译问题解决记录
本来SSD做测试的Python接口用起来也是比较方便的,但是如果部署集成的话,肯定要用c++环境,于是动手鼓捣了一下. 编译用的cmake,写的CMakeList.txt,期间碰到一些小问题,简单记录 ...
- day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息
目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...
- Unity 编译错误记录
1. 相关代码: NetworkView.RPC ("ReceiveMessage", RPCMode.All, message); 编译输出: Assets/cs/ClientC ...
- openwrt编译出错处理记录
1.代码从windows复制过来编译报错处理,参考:http://www.360doc.com/content/13/1016/21/3884271_321966616.shtml 2.编译lua-s ...
- C++ Qt 框架静态编译 操作记录
谁愿意写个程式出来之后还附带一堆DLL,尤其是名字如此明显的名字. 于是在网上看了看,是需要下载源代码然后进行编译的,但是看了看别人说的编译时间,长达几个小时,瞬间就感觉不想做了.因为我还需要抓紧时间 ...
随机推荐
- python3练习-装饰器
在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...
- Laravel框架如何去除URL中的/public
laravel/server.php改名为index.php 并且将public目录下的.htaccess拷贝到Larvael根目下 再访问 如有配置不成功的请加群
- sqlcipher 数据库解密
使用 sqlcipher.exe 可以在输入密码后,查看加密数据库的内容. 但是要编码查询数据库的内容,还要另寻方法.(相关的工具和库在我的百度网盘中) 使用sqlcipher windows 命令工 ...
- 分析图第二讲导出图片和后期PS5.12
导出渲染的白模加上EXTRATEX.再导出一张“消隐”样式的模型图片.就是线稿图. 再导出一张着色显示图,并去掉边线.,用于后期PS选择范围用. 把这几张图全都导入ps. 渲染图的阴影面是灰色的,示例 ...
- jsp 中文乱码
解决jsp中文乱码问题的几个步骤 1 jsp页面设置 <%@ page language="java" contentType="text/html; ...
- Java Swing 简单介绍
Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...
- 每天CSS学习之border-collapse
border-collapse是CSS2的一个属性,其作用是折叠表格(table)的边框.collapse翻译过来又折叠的意思. border-collapse有三个值: collapse:将表格和单 ...
- Mac下安装ipython与jupyter
IPython从Python发展而来,更倾向于科学计算.互联网数据分析更喜欢用. 首先切换root用户: sudo su - pip3自动安装ipython yuchaodeMacBook-Pro:~ ...
- [Linux]Linux下rsync服务器和客户端配置
一.rsync简介 Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异( ...
- Innodb引擎简介
一.锁 二.什么情况出现阻塞 1.频繁更改的表,出现了慢查询 2.频繁访问的表,出现了备份等(表级锁) 三.查看运行情况 show engine innodb status; 四.关键参数 innod ...