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中使用的插件逻辑一致:
- 实现Artemis的
org.apache.activemq.artemis.core.server.plugin.BrokerPlugin接口 - 重写
beforeSend方法,修改发往别名地址的消息的目标地址为实际地址 - 重写
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")); } }
- 写完插件后将jar包放入Artemis的
lib目录,在broker.xml中注册插件即可生效。
注意事项
- 如果开启了地址权限控制,需要同时给别名地址和实际地址配置对应角色的读写权限,避免业务侧连接时出现权限拒绝错误
- 别名映射关系尽量保持稳定,避免运行过程中修改,否则会影响已连接的生产者/消费者的路由逻辑,以及持久订阅的恢复
内容的提问来源于stack exchange,提问作者Nicolas Verducou
相关产品推荐
相关产品推荐

