我有一个关于 ActiveMQ Artemis 中 Camel 共享持久订阅的问题。 我已从 ActiveMQ Classic VirtualTopics 迁移,并且我的代理中有以下配置:
<address name="VirtualTopic.ccncsi.fromEurope">
<multicast>
<queue name="Consumer.dispatcher.VirtualTopic.ccncsi.fromEurope"/>
<queue name="Consumer.ccncsiaudit.VirtualTopic.ccncsi.fromEurope"/>
<queue name="Consumer.ccncsigateway.VirtualTopic.ccncsi.fromEurope"/>
</multicast>
</address>
我正在尝试使用 JMS 端点通过端点连接到地址
VirtualTopic.ccncsi.fromEurope
和订阅名称 Consumer.dispatcher.VirtualTopic.ccncsi.fromEurope
jms:topic:VirtualTopic.ccncsi.fromEurope?subscriptionName=Consumer.dispatcher.VirtualTopic.ccncsi.fromEurope&subscriptionDurable=true&subscriptionShared=true
灵感来自 Stack Overflow 上的 this thread。
但是,当部署路由并赋予足够的权限时,端点会在地址上创建一个新队列,并在
中定义的现有队列(即
.
)旁边转义点(即
Consumer\.dispatcher\.VirtualTopic\.ccncsi\.fromEurope
)。 Consumer.dispatcher.VirtualTopic.ccncsi.fromEurope
。我需要保留此消费者队列名称,因为较旧的客户端使用 VirtualTopic 映射通过 WebLogic 和 Openwire 协议进行连接。
broker.xml
,但我希望我的端点从现有队列中消费:
Consumer\.dispatcher\.VirtualTopic.ccncsi\.fromEurope
如果罪魁祸首是 Camel 或 Artemis,我就无法锻炼,但是当调用 Consumer.dispatcher.VirtualTopic.ccncsi.fromEurope
且请求 (
org.apache.activemq.artemis.core.protocol.core.ServerSessionPacketHandler#session.createSharedQueue(request.toQueueConfiguration());
) 转换为 org.apache.activemq.artemis.core.protocol.core.Packet
时,我可以看到点已经被转义了。这是正常行为吗?
这里首先要注意的是,订阅队列的名称(即本例中的
QueueConfiguration
)是经纪人控制下的实现细节。对于非共享的持久订阅,代理将使用客户端 ID 和订阅名称组成订阅队列名称,并以点字符 (
Consumer\.dispatcher\.VirtualTopic\.ccncsi\.fromEurope
) 分隔。由于点字符是分隔符,代理会转义客户端 ID 和订阅名称中任何现有的点。对于共享持久订阅,客户端 ID 被省略,仅使用订阅名称,但代理仍然避开这些点。也就是说,您仍然可以通过在 Camel 路由中使用完全限定的队列名称来获得您想要的行为,例如:
.
我对 Camel 不太熟悉,所以其中多余的冒号(即
jms:queue:VirtualTopic.ccncsi.fromEurope::Consumer.dispatcher.VirtualTopic.ccncsi.fromEurope
)可能需要转义,但希望你能明白。使用 FQQN 将允许您在队列上创建一个使用者,该使用者将与您环境中的其他虚拟主题使用者共享消息。