2

Java EE 应用程序获取由 JMS 队列传递的数据。不幸的是,某些传递的消息相互依赖,因此必须以正确的顺序处理它们。据我了解,我不能在这里依赖 JMS(或者我可以吗?我知道它们会以正确的顺序发送)。

此外,可能会有一种消息将由消息的提供者拆分,因此在某些情况下,成千上万的这些消息将被发送到应用程序,所有这些消息都与特定实体相关. 没有必要一个一个地处理它们(这将是最简单的方法,例如在 MDB 中),我担心如果我这样处理它们会很糟糕,因为我总是必须在数据库,所以我宁愿以某种方式对它们进行批处理,并在一个事务中完全处理它们。但我不知道该怎么做,因为我在从队列中读取时没有检测到批处理消息的方法。我可以每秒左右将所有消息从队列中取出并处理它们,但是我不确定是否已经存在相互依赖的消息。

所以我认为我需要某种缓冲/缓存或某事。像这样在接收和处理 JMS 消息之间,但我目前没有看到一个好的方法。

任何想法如何处理这种情况?

4

2 回答 2

3

JMS 规范的第 4.4.10 节指出:

JMS 定义会话发送到目的地的消息必须按照它们发送的顺序被接收(参见第 4.4.10.2 节“消息发送的顺序”,了解一些限定)。这定义了会话输入消息流的部分排序约束

(资格主要是关于QoS和非持久消息)。

规范继续:

JMS 没有定义跨目标或跨从多个会话发送的目标消息的消息接收顺序。会话输入消息流顺序的这一方面与时间相关。它不受应用程序控制。

因此,依赖 JMS 客户端中的排序实际上归结为生产者的会话范围和生产者的数量。

您还可以考虑在事务中对相关消息进行分组,以确保您正在执行的任何操作的原子性。

希望那些对你有帮助。

编辑:我假设您通过使用某种相关 ID 来了解“相关消息”/依赖项?我认为您的问题与例如非常相似。TCP,所以也许您可以使用该领域的算法来确保消息的有序传递?

干杯,

于 2013-10-14T08:18:16.710 回答
0

JMSQueue肯定会以正确的顺序处理它们。毕竟,它是一个队列(你不能插队)。

于 2013-10-14T07:58:18.317 回答