0

让我们假设一个 MDB 已收到一条消息并已开始在 CMT/必需事务中处理它,并假设该事务可能需要一些时间才能完成。

在这种情况下,是否有可能在另一个事务中由另一个 MDB 实例接收和处理重复的消息,而第一个事务仍在进行中?

或者容器是否会确保当 MDB 忙于处理 CMT/必需事务中的消息时,没有其他 MDB 实例会收到相同消息的欺骗?

4

1 回答 1

0

我希望在事务的一部分时锁定任何消息,并且不应该发送重复的消息,因为 JMS 规范要求:

4.4.15 消息的重复产生:JMS 提供者绝不能产生重复的消息。这意味着产生消息的客户端可以依赖其 JMS 提供者来确保消息的消费者只会收到一次。

所以我认为您可以依靠消息传递提供程序来确保 MDB 不会收到消息的第二个副本,除非第一个被显式回滚或事务超时并隐式回滚。这两个操作都应该“解锁”消息并使其可用于重新传递到 MDB,其中 JMSRedelivered 设置为 true 并且 JMSXDeliveryCount 递增。

我怀疑在一个(或多个)EJB、JCA 或 JTA 规范(或 J2EE,就此而言)中补充 JMS 规范有更多要求,我没有检查。

于 2011-08-01T13:17:04.507 回答