我已经使用 HornetQ 作为 JMS 提供者(队列)设置了一个 jms 服务器。
我有一个作为生产者的应用程序和另一个(不同的计算机)作为消费者的应用程序。
我知道 JMS 规范不能保证传递的顺序,但我正在寻找一种方法来做到这一点:完全按照它们发送的顺序接收消息,即使它是特定于提供者的。
有任何想法吗?
显然,这可以通过禁用消费者缓存来实现。这是通过更改hornetq-jms.xml
:
<connection-factory name="ConnectionFactory">
<connectors>
<connector-ref connector-name="netty-connector"/>
</connectors>
<entries>
<entry name="ConnectionFactory"/>
</entries>
<consumer-window-size>0</consumer-window-size> <!-- add this line -->
</connection-factory>
实际上,JMS 规范的第 4.4.10.2 节(消息发送的顺序)对排序非常清楚。
如果您有一个生产者和一个消费者订阅队列或主题,则即使存在重新传递,也始终保证消息排序。
如果您有多个消费者,则可能会在回滚或关闭消费者的情况下重新交付客户端缓冲,并且可能会无序交付客户端缓冲区。
在 HornetQ 上,您还拥有消息组,它为生成的消息赋予额外的排序约束。