我正在审查用Java编写的客户端 - 服务器应用程序。服务器接收JMS消息并处理它们,但消息可能以意外的顺序出现,并且取消可以在订单消息之前到达。你是如何处理这种情况的?你是在mdb吗?
这种情况有哪些策略或模式?
答案 0 :(得分:16)
到目前为止,我知道,这被称为“无序”传递,并且是JMS系统的服务质量(QoS)属性的一部分。我认为它不是JMS规范的一部分,但有些提供商可能支持它。这取决于您使用的特定JMS实现。
但请注意,JMS旨在以分配负载的方式将消息分发给几个使用者。如果必须以有序的方式传递消息,则这是不可能的 - 它基本上导致消息传递的序列化,并且消息不能同时处理。
wikipedia说它比我好:
JMS队列 包含已发送的邮件的暂存区域 等待阅读。注意, 与名称排队的相反 建议,消息不一定是 按订单发送。如果 消息驱动的bean池包含更多 比一个实例然后消息可以 同时处理,因此它是 可能是以后的消息 处理得比早先的早。 JMS队列仅保证每个队列 消息只处理一次。
然后使用JMS很难实现带外取消请求。两个想法:
否则,请查看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可能有一个保留订单的解决方案。我想这会使它具有特定的特征。