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

ActiveMQ-Artemis是否支持创建受限通配符订阅?

ActiveMQ Artemis 受限通配符订阅实现方案

ActiveMQ Artemis 本身没有原生支持你描述的这种"受限通配符订阅"——也就是直接订阅+/#后自动根据权限过滤掉无权限主题的消息。不过有几种替代方案可以实现类似需求:

方案1:拆分多订阅直接匹配权限范围内的主题

直接让客户端分别订阅ONE/#和TWO/#,而不是使用+/#通配符。因为你的user角色已经拥有这两个主题的权限,这两个订阅会正常接收对应主题的消息,自然不会收到THREE/#的内容。

  • 优势:无需额外配置,完全依托现有权限体系实现,逻辑简单直观。
  • 劣势:如果权限包含的主题数量较多,客户端需要维护多个订阅实例。

方案2:通过地址转发聚合目标主题消息

在broker.xml中配置地址转发规则,将ONE/#和TWO/#下的所有消息转发到一个统一的聚合地址(比如COMBINED/#),然后让客户端订阅这个聚合地址。
配置示例:

<address-settings>
  <!-- 转发ONE下所有子主题到COMBINED对应路径 -->
  <address-setting match="ONE/#">
    <forwarding-address>COMBINED/${address.subject}</forwarding-address>
  </address-setting>
  <!-- 转发TWO下所有子主题到COMBINED对应路径 -->
  <address-setting match="TWO/#">
    <forwarding-address>COMBINED/${address.subject}</forwarding-address>
  </address-setting>
</address-settings>

之后给user角色配置COMBINED/#的订阅权限,客户端订阅COMBINED/#就能收到ONE/#和TWO/#的所有消息,不会包含THREE/#的内容。

方案3:客户端侧添加消息过滤规则

如果使用JMS API,可以在创建订阅时指定消息过滤条件,只接收来自ONE或TWO开头主题的消息。
示例Java代码:

// 过滤条件:仅接收JMS目标地址为ONE/或TWO/开头的消息
String filter = "JMSDestination LIKE 'ONE/%' OR JMSDestination LIKE 'TWO/%'";
MessageConsumer consumer = session.createConsumer(topic, filter);
  • 注意:这种方式是客户端本地过滤,broker仍然会把所有匹配+/#的消息发送到客户端,可能带来额外的网络开销;另外需要确保过滤条件和主题结构匹配,避免漏收或误收。

补充说明

Artemis的权限控制逻辑是在订阅创建时校验权限,而非消息投递时动态过滤。如果user角色没有+/#的订阅权限,直接订阅会失败;如果拥有该权限,订阅后会接收所有匹配+/#的消息,不会再检查子主题的权限。因此无法通过原生权限体系实现你想要的"通配符订阅+权限过滤"效果,只能通过上述替代方案达成类似需求。

内容的提问来源于stack exchange,提问作者Florian Jäger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:04:52