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

ActiveMQ Artemis如何配置目的地别名 实现同一目的地多名称访问

ActiveMQ Artemis 目的地别名实现方案

内置方案(推荐,适用于2.28.0及以上版本)

ActiveMQ Artemis 从2.28.0版本开始原生支持*地址别名(Address Alias)*能力,完全覆盖你提到的需求,不需要自定义插件或者divert组合配置:

  • 配置方式:在broker.xml的核心配置节点下添加<address-aliases>配置块,示例如下:
<address-aliases>
  <!-- 配置dest2为dest1的别名 -->
  <address-alias name="dest2" maps-to="dest1"/>
</address-aliases>
  • 效果说明:
    • 生产者发送到dest2的消息会自动被路由到实际地址dest1
    • 消费者订阅dest2时会自动被引导到dest1接收消息
    • 整个映射逻辑对业务侧完全透明,生产者和消费者可以任选两个名称使用

注:该方案比divert适用性更强,divert仅能实现消息单向转发,无法处理消费者订阅的地址路由逻辑。

低版本兼容方案(适用于2.28.0以下版本)

如果使用的Artemis版本低于2.28.0,可以通过自定义Broker插件实现,逻辑和你在ActiveMQ Classic中使用的插件逻辑一致:

  1. 实现Artemis的org.apache.activemq.artemis.core.server.plugin.BrokerPlugin接口
  2. 重写beforeSend方法,修改发往别名地址的消息的目标地址为实际地址
  3. 重写beforeCreateConsumer方法,将订阅别名地址的消费者的目标地址修改为实际地址
    示例核心代码:
@Override
public Message beforeSend(ServerSession session, Transaction tx, Message message, boolean direct, boolean noAutoCreateQueue) throws ActiveMQException {
    if (message.getAddress().toString().equals("dest2")) {
        message.setAddress(new SimpleString("dest1"));
    }
    return message;
}

@Override
public void beforeCreateConsumer(ServerConsumer consumer) throws ActiveMQException {
    if (consumer.getQueueAddress().toString().equals("dest2")) {
        consumer.getQueue().setAddress(new SimpleString("dest1"));
    }
}
  1. 写完插件后将jar包放入Artemis的lib目录,在broker.xml中注册插件即可生效。

注意事项

  • 如果开启了地址权限控制,需要同时给别名地址和实际地址配置对应角色的读写权限,避免业务侧连接时出现权限拒绝错误
  • 别名映射关系尽量保持稳定,避免运行过程中修改,否则会影响已连接的生产者/消费者的路由逻辑,以及持久订阅的恢复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:36:03