You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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中对收到的通知做两层过滤即可:
    1. 筛选目标地址为test/topic的事件
    2. 匹配你要识别的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.notifications Topic的订阅权限
  • 用方案2的话,需要分配管理API的调用权限

内容的提问来源于stack exchange,提问作者ShreyasJavahar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:06:04