2010-11-03 54 views
8

我已经设置了一个JMS服务器作为JMS提供者(队列)的HornetQ。强制HornetQ消息的顺序

我有一个应用程序作为生产者和另一个(不同的计算机)作为消费者。

我知道JMS规范并不保证交货顺序,但我正在寻找一种方法来做到这一点:按照发货的顺序收到消息,确切地说是,即使它是提供商具体。

任何想法?

回答

2

显然这可以通过禁用消费者缓存来实现。这是通过改变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> 
+1

但是,通过将窗口大小设置为0,您已经有效地杀死了一层会影响性能的缓存。 – 2011-01-03 00:35:37

+0

在我看来,消息的顺序比一些潜在的性能损失重要得多。但是,如果你有更好的想法,我真的很想听到它。谢谢。 – Bogdan 2011-01-03 06:33:19

+0

设置这个选项并不适合我,在HornetQ 2.2.5本地测试。一个客户端产生消息,一个消费,顺序不连续。 – Dag 2012-10-08 14:11:04

1

其实JMS规范的第4.4.10.2(消息的顺序发送)约为排序很清楚。

如果您拥有单个生产者,并且单个消费者拥有队列或主题订阅,那么即使存在重新传送,也会始终保证消息排序。

如果您有多个使用者,则在回滚或关闭您的使用者时可能会重新传递客户端缓冲,并且客户端缓冲区可能不按顺序传递。

在HornetQ上,你也有消息组,它赋予生成的消息额外的排序约束。