python对接rocketmq

背景

有对接 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
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值