Java EE应用程序获取JMS队列传递的数据。不幸的是,一些传递的消息彼此依赖,因此必须按正确的顺序处理它们。据我所知,我不能在这里依赖JMS(或者我可以吗?我知道它们将以正确的顺序发送)。
此外,可能会出现一种消息将由消息提供者分割,因此在某些情况下,将有数千条消息发送到应用程序,所有这些消息都与一个特定的实体。没有必要逐个处理它们(这将是最简单的方法,例如在MDB中)并且我担心如果我以这种方式处理它们将是一个糟糕的性能,因为我总是需要保存一些信息。数据库,所以我更喜欢以某种方式批量处理它们并在一个事务中完全处理它们。但我不知道如何做到这一点,因为我从队列中读取时没有检测到批量消息的方法。我可以每隔一秒左右从队列中获取所有消息并处理它们,但是我不确定是否已经存在相互依赖的消息。
所以我认为我需要某种缓冲/缓存或者......在接收和处理JMS消息之间这样,但我目前看不到好的方法。
如何处理这种情况?
答案 0 :(得分:3)
JMS spec的第4.4.10节规定:
JMS定义必须接收会话发送到目的地的消息 按发送顺序排列(参见第4.4.10.2节“消息顺序” 发送,“为一些资格)。这定义了a上的部分排序约束 会话的输入消息流
(资格主要是关于QoS和非持久性消息)。
规范继续:
JMS没有定义跨目的地或跨越的消息接收顺序 目标从多个会话发送的消息。会话的这个方面 输入消息流顺序与时间有关。它没有申请 控制。
因此,依赖于JMS客户端的排序实际上归结为生产者的会话范围和生产者的数量。
您还可以考虑在事务中对相关消息进行分组,以确保您正在执行的任何操作的原子性。
希望有所帮助。
编辑:我假设您通过使用某种correlationID来了解“相关消息”/依赖项?我认为你的问题非常类似于例如。 TCP,所以也许您可以使用该区域的算法来确保有序传递您的消息?
干杯,
答案 1 :(得分:0)
JMS Queue
肯定会以正确的顺序处理它们。毕竟,它是一个队列(你不能排成一行)。