使用ActiveMQ Artemis时能否检测到停止监听topic的订阅者?
ActiveMQ Artemis Topic模式订阅者在线状态检测实现方案
ActiveMQ Artemis 2.18.0本身自带订阅生命周期事件通知和管理查询能力,无需依赖数据库轮询即可实现需求,且完全兼容你当前已落地的topic通信架构,不需要修改现有业务交互逻辑。
实现方案
方案1:监听内置通知Topic实现实时状态感知(推荐)
Artemis默认会将broker上的所有资源生命周期事件推送到内置的activemq.notifications Topic,你可以直接在生产者端(SB1)订阅该Topic,过滤目标订阅者的上下线事件:
- 首先确认
broker.xml中已开启管理通知配置(2.18.0版本默认开启):<management-notification-address>activemq.notifications</management-notification-address> - 事件匹配规则:
- 当订阅者上线创建监听时,会触发
CONSUMER_CREATED类型的通知,通知体携带订阅的目标地址、客户端ID、会话ID等字段 - 当订阅者下线/掉线超过会话超时时间、主动关闭监听时,会触发
CONSUMER_CLOSED类型的通知
- 当订阅者上线创建监听时,会触发
- 你只需要在SB1中对收到的通知做两层过滤即可:
- 筛选目标地址为
test/topic的事件 - 匹配你要识别的SB2、SB3的固定客户端ID,即可实时更新对应的
online status
- 筛选目标地址为
注意:所有Spring Boot客户端必须配置固定的
client-id(和MQTT连接用的clientId保持一致),不要使用动态生成的ID,否则无法唯一识别订阅者身份。如果使用持久订阅,临时网络闪断不会立刻触发下线事件,只有超过配置的会话超时时间后才会推送CONSUMER_CLOSED,符合活跃监听的判断逻辑。
方案2:调用管理接口按需查询
如果你不需要实时感知上下线事件,只需要在特定时点查询指定订阅者是否在线,可以直接调用Artemis的JMS管理接口:
- 在SB1中注入Artemis的JMS管理控制对象,调用
getConsumersOnAddress("test/topic")方法,即可获取当前该Topic上所有活跃消费者的列表 - 对比返回列表中的客户端ID和SB2、SB3的固定ID,即可得到对应订阅者的在线状态
权限配置说明
如果你的broker开启了权限控制,需要给SB1的账号分配对应权限:
- 用方案1的话,需要分配
activemq.notificationsTopic的订阅权限 - 用方案2的话,需要分配管理API的调用权限
内容的提问来源于stack exchange,提问作者ShreyasJavahar
相关产品推荐
相关产品推荐

