如何处理JMS中的消息顺序?

时间:2010-02-12 13:35:13

标签: java jms

我正在审查用Java编写的客户端 - 服务器应用程序。服务器接收JMS消息并处理它们,但消息可能以意外的顺序出现,并且取消可以在订单消息之前到达。你是如何处理这种情况的?你是在mdb吗?

这种情况有哪些策略或模式?

4 个答案:

答案 0 :(得分:16)

到目前为止,我知道,这被称为“无序”传递,并且是JMS系统的服务质量(QoS)属性的一部分。我认为它不是JMS规范的一部分,但有些提供商可能支持它。这取决于您使用的特定JMS实现。

但请注意,JMS旨在以分配负载的方式将消息分发给几个使用者。如果必须以有序的方式传递消息,则这是不可能的 - 它基本上导致消息传递的序列化,并且消息不能同时处理。

wikipedia说它比我好:

  

JMS队列   包含已发送的邮件的暂存区域   等待阅读。注意,   与名称排队的相反   建议,消息不一定是   按订单发送。如果   消息驱动的bean池包含更多   比一个实例然后消息可以   同时处理,因此它是   可能是以后的消息   处理得比早先的早。   JMS队列仅保证每个队列   消息只处理一次。

然后使用JMS很难实现带外取消请求。两个想法:

  • 存储与数据库中每条消息对应的票证,可以轻松取消消息。邮件传递时,MDB会检查相应的票证是否仍然有效。如果是,则继续进行,如果没有,则删除该消息。
  • 尝试将MDB池大小设置为1。也许在这种情况下,将订购交货。更改池大小是应用程序。特定于服务器,但大多数都支持每个bean池大小。

否则,请查看message store模式。无论如何,值得查看EAI网站。

答案 1 :(得分:8)

如果系统可以处理无序消息,那么您的系统将更加灵活。我过去用来解决这个问题的模式是使用延迟队列(在金融界每天处理800万条消息的系统上)。

在您的示例中,如果我收到了尚未收到的订单的删除,我会将其延迟一段时间并重试。如果我仍然不知道我被要求删除的顺序,我会提出某种错误(回复原始发件人,将邮件发送到特殊错误队列,......)。

对于延迟队列的实现,这可以是具有可以接受要延迟的消息的服务的另一个JMS队列。然后,它会定期读取延迟的消息并检查延迟的时间段是否已过期,并将消息重新提交到原始目标队列。

答案 2 :(得分:6)

我的第二个关于检查EAI网站的建议,以及它所依据的书(关于MOM和MOM模式的精彩文本)。

我个人会调查Resequencer

答案 3 :(得分:2)

How to assure the sequence of message received by mdb? 是关于服务器端的类似主题,有人指出ActiveMQ可能有一个保留订单的解决方案。我想这会使它具有特定的特征。