从 v4.1 版本开始,EMQ X MQTT 服务器 提供了专门的多语言支持插件 emqx_extension_hook ,现已支持使用其他编程语言来处理 EMQ X 中的钩子事件,开发者可以使用 Python 或者 Java 快速开发自己的插件,在官方功能的基础上进行扩展,满足自己的业务场景。例如:
验证某客户端的登录权限:客户端连接时触发对应函数,通过参数获取客户端信息后通过读取数据库、比对等操作判定是否有登录权限
记录客户端在线状态与上下线历史:客户端状态变动时触发对应函数,通过参数获取客户端信息,改写数据库中客户端在线状态
校验某客户端的 PUB/SUB 的操作权限:发布/订阅时触发对应函数,通过参数获取客户端信息与当前主题,判定客户端是否有对应的操作权限
处理会话 (Sessions) 和 消息 (Message) 事件,实现订阅关系与消息处理/存储:消息发布、状态变动时触发对应函数,获取当前客户端信息、消息状态与消息内容,转发到 Kafka 或数据库进行存储。
注:消息(Message) 类钩子,仅在企业版中支持。
Python 和 Java 驱动基于 Erlang/OTP-Port 进程间通信实现,本身具有非常高的吞吐性能,本文以 Java 拓展为例介绍 EMQ X 跨语言拓展使用方式。
img
Java 拓展使用示例
要求
EMQ X 所在服务器需安装 JDK 1.8 以上版本
开始使用
创建 Java 项目
添加SDK io.emqx.extension.jar和 erlport.jar 到项目依赖
复制 examples/SampleHandler.java到您的项目中
根据 SDK SampleHandler.java 中的示例编写业务代码,确保能够成功编译
部署
编译所有源代码后,需要将 sdk 和代码文件部署到 EMQ X 中:
复制 io.emqx.extension.jar 到 emqx/data/extension 目录
将编译后的 .class 文件,例如 SampleHandler.class 复制到 emqx/data/extension目录
修改 emqx/etc/plugins/emqx_extension_hook.conf 配置文件:
exhook.drivers = java
## Search path for scripts or library
exhook.drivers.java.path = data/extension/
exhook.drivers.java.init_module = SampleHandler
启动 emqx_extension_hook 插件,如果配置错误或 Java 代码编写错误将无法正常启动。启动后尝试建立 MQTT