背景
有对接 java 系统监听其相关资源同步新增的需求,该 java 系统使用了 rocketmq。
前置说明
1、目前 Python 客户端仅支持 Linux 和 macOS 操作系统,暂不支持 Windows 系统
2、rocketmq-client-python 基于 rocketmq-client-cpp 进行包装,因此需要先编译出 librocketmq.so
3、文档中相关源码包和依赖包版本和 github 中 README.md 有所差异,注意辨别
4、如果项目不是以 root 用户启动,先看最后一节
安装 librocketmq
编译前,服务器安装相关依赖
sudo yum install -y gcc gcc-c++ make cmake openssl-devel automake libtool autoconf bzip2-devel zlib-devel
Github 下载 rocketmq-client-cpp 源码包 rocketmq-client-cpp-2.2.0.tar.gz 上传到服务器
如果服务器为离线状态,需要在 pypi.org 提前下载:
boost_1_58_0.tar.gz
jsoncpp-0.10.7.zip
libevent-release-2.1.11-stable.zip
openssl-1.1.1d.tar.gz
解压源码包 rocketmq-client-cpp-2.2.0.tar.gz
tar -zxvf rocketmq-client-cpp-2.2.0.tar.gz
cd rocketmq-client-cpp-2.2.0
将前面提前下载的依赖包放到解压后 rocketmq-client-cpp-2.2.0 目录下
开始编译
sh build.sh
编译成功会出现提示
############# Start package static rocketmq library. #############
############# Package static rocketmq library success.#############
Build success without executing unit tests.
检查编译产物
ls -l bin/
# -rw-r--r-- 1 root root 31136772 May 22 14:12 librocketmq.a
# -rwxr-xr-x 1 root root 8563280 May 22 14:11 librocketmq.so
编译后的文件 librocketmq.so 需要放到 python 的依赖包 rocketmq 目录下
由于在代码中实现在部署时将该文件放到指定目录较为麻烦,却会遇到目录权限问题,最后选择将 rocketmq-client-python 内置,即将 site-packages 中 rocketmq 目录放到代码中,再将 librocketmq.so 放到 roketmq 目录下
rocketmq
| client.py
| consts.py
| exceptions.py
| ffi.py
| librocketmq.so
\ __init__.py
自此已完成常规接入
简单使用
# SimplePushConsumer 消费消息
import time
from rocketmq.client import PushConsumer, ConsumeStatus
# 消息处理回调
def callback(msg):
# 模拟业务
print('Received message. messageId: ', msg.id, ' body: ', msg.body)
# 消费成功回复CONSUME_SUCCESS
return ConsumeStatus.CONSUME_SUCCESS
# 消费失败返回RECONSUME_LATER,该消息将会被重新消费
# return ConsumeStatus.RECONSUME_LATER
# 初始化消费者,并设置消费者组信息,自行设置
consumer = PushConsumer('rocketmq-xxx|namespace_python%group11')
# 设置服务地址
consumer.set_name_server_address('xxx.xxx.xxx.xxx:9876')
# 设置权限(角色名和密钥)
consumer.set_session_credentials(
'access_key',
'access_secret',
''
)
# 订阅 topic,接收对应 topic 的信息,绑定回调函数,接收消息后执行回调函数处理消息
consumer.subscribe('rocketmq-xxx|namespace_python%topic1', callback, "*")
print(' [Consumer] Waiting for messages.')
# 启动消费者
consumer.start()
# 必须
time.sleep(3600)
# 资源释放
consumer.shutdown()
其他问题
如果项目不是以 root 账号运行,会报错没有权限,排查之后发现 rocketmq-python-cpp 的代码中日志路径在 root 目录下,因为我使用 root 账号编译的
需要更改其代码后重新编译
// rocketmq-client-cpp/src/common/UtilAll.cpp
string UtilAll::getHomeDirectory() {
#ifndef WIN32
char* homeEnv = getenv("HOME");
string homeDir;
if (homeEnv == NULL) {
homeDir.append(getpwuid(getuid())->pw_dir);
} else {
homeDir.append(homeEnv);
}
#else
string homeDir(getenv("USERPROFILE"));
#endif
return homeDir;
}
// return homeDir; -> return "target_dir";
// sh build.sh