我有一个地址和一个队列,在
broker.xml
中定义如下:
<address-settings>
...
<auto-create-queues>false</auto-create-queues>
<auto-create-addresses>false</auto-create-addresses>
</address-settings>
<addresses>
<address name="news.world">
<multicast>
<queue name="america.sport"/>
</multicast>
</address>
...
我旋转两个消费者(不同的会话/连接)来监听
news.world::america.sport
并向其发送消息。但只有一个消费者收到该消息。
通过自动创建的地址/队列,每个消费者都会获得自己的队列(以 uuid 命名),并且消息似乎被克隆到每个消费者,因此两者都会收到它。我想避免由于存储限制而进行消息克隆,并认为通过使用非自动创建的地址/队列来实现这一点。我想知道为什么单个“硬编码”多播队列实际上表现得像任播队列。
根据您的描述,我认为一切都按设计进行。
由于您有 2 个消费者共享同一个队列(即地址上的
america.sport
news.world
),他们当然会共享相同的消息。换句话说,队列中的消息将分发给一个消费者或另一个消费者,而不是同时分发给两者。这符合队列的基本语义。
队列是多播这一事实并不会改变队列中的消息分发给消费者的方式。多播是一种路由类型,因此仅影响消息从地址路由到队列的方式。
此外,当发送到某个地址的消息被放置在每个多播队列上时,您观察到的消息“克隆”实际上只有很少的开销。您似乎认为每个队列上的消息都是独立存储的,就好像发送到同一地址上的 100 个多播队列的一条消息被存储了 100 次一样。事实并非如此。实际的消息(即正文、标头和属性)仅存储一次,然后每个队列都会获得对该消息的“引用”。为了不浪费资源(即内存或磁盘),该引用的开销故意非常小。如果您有“存储限制”,那么在单个多播队列上使用多个使用者并不是解决它们的方法。