【发布时间】:2011-06-06 09:18:39
【问题描述】:
我已经使用 HornetQ 作为 JMS 提供者(队列)设置了一个 jms 服务器。
我有一个应用程序作为生产者,另一个(不同的计算机)作为消费者。
我了解 JMS 规范不保证发送顺序,但我正在寻找一种方法来做到这一点:完全按照发送顺序接收消息,即使它是特定于提供商的。
有什么想法吗?
【问题讨论】:
我已经使用 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 上,您还拥有消息组,它为生成的消息赋予额外的排序约束。
【讨论】: