Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理JMS中消息的顺序?_Java_Jms - Fatal编程技术网

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

Java 如何处理JMS中消息的顺序?,java,jms,Java,Jms,我正在审查一个用Java编写的客户机-服务器应用程序。服务器接收JMS消息并对其进行处理,但这些消息可能以意外的顺序出现,并且取消消息可能在订单消息之前到达。你如何处理这样的案件?你是在mdb里做的吗 这种情况下有哪些策略或模式?据我所知,这被视为“无序”交付,是JMS系统服务质量(QoS)属性的一部分。我不认为它是JMS规范的一部分,但是一些提供商可能支持它。这将取决于您使用的特定JMS实现 但是请注意,JMS旨在以一种分配负载的方式将消息分发给多个使用者。若消息必须以有序的方式传递,这是不可

我正在审查一个用Java编写的客户机-服务器应用程序。服务器接收JMS消息并对其进行处理,但这些消息可能以意外的顺序出现,并且取消消息可能在订单消息之前到达。你如何处理这样的案件?你是在mdb里做的吗


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

据我所知,这被视为“无序”交付,是JMS系统服务质量(QoS)属性的一部分。我不认为它是JMS规范的一部分,但是一些提供商可能支持它。这将取决于您使用的特定JMS实现

但是请注意,JMS旨在以一种分配负载的方式将消息分发给多个使用者。若消息必须以有序的方式传递,这是不可能的——它基本上会导致消息传递的序列化,并且消息不能被并发处理

他说得比我好:

JMS队列 一个暂存区域,其中包含已发送和正在发送的消息 等待阅读。请注意, 与队列的名称相反 这意味着,信息不必是 按发送的顺序发送。如果 消息驱动bean池包含更多 然后可以创建多个实例 同时处理,因此 可能是稍后的消息 处理速度比以前的快。 JMS队列只保证每个 消息只处理一次

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

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

否则,请看一下图案。无论如何,这是值得一看的网站。

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

在您的示例中,如果我收到一个尚未收到的订单的删除,我会将其延迟一段时间,然后重试。如果我仍然对被要求删除的订单一无所知,我会引发某种错误(回复原始发件人,向特殊错误队列发送消息,…)


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

我支持有关检查EAI站点的建议,以及它所基于的书籍(关于MOM和MOM模式的精彩文本)


不过,就我个人而言,我会调查这个问题。

是关于服务器端的一个类似主题,其中有人指出可能有一个保持秩序的解决方案。不过,我想这会让它更具体。

谢谢,我会看一看。谢谢,我会看一看。谢谢,我会看一看。如果您使用的是Wildfly/JBoss,您必须在服务器配置文件Standalone*.xml上设置最大池大小=1