【发布时间】:2011-08-01 21:17:04
【问题描述】:
让我们假设 MDB 已收到一条消息并已开始在 CMT/必需事务中处理它,并假设该事务可能需要一些时间才能完成。
在这种情况下,是否有可能在另一个事务中的另一个 MDB 实例接收和处理重复的消息,而第一个事务仍在进行中?
或者容器是否会确保当 MDB 忙于处理 CMT/必需事务中的消息时,没有其他 MDB 实例会收到相同消息的副本?
【问题讨论】:
标签: jakarta-ee ejb message-driven-bean
让我们假设 MDB 已收到一条消息并已开始在 CMT/必需事务中处理它,并假设该事务可能需要一些时间才能完成。
在这种情况下,是否有可能在另一个事务中的另一个 MDB 实例接收和处理重复的消息,而第一个事务仍在进行中?
或者容器是否会确保当 MDB 忙于处理 CMT/必需事务中的消息时,没有其他 MDB 实例会收到相同消息的副本?
【问题讨论】:
标签: jakarta-ee ejb message-driven-bean
我希望任何消息在事务的一部分时都被锁定,并且不应该发送重复的消息,因为 JMS 规范要求:
4.4.15 消息的重复生成: JMS 提供者绝不能产生重复的消息。这意味着一个 生成消息的客户端可以依赖其 JMS 提供者来确保 消息的消费者只会收到一次。
所以我认为您可以依靠消息传递提供程序来确保 MDB 不会收到消息的第二个副本,除非第一个副本显式回滚或事务超时并隐式回滚。这两个操作都应该“解锁”消息并使其可用于重新传递到 MDB,其中 JMSRedelivered 设置为 true 并且 JMSXDeliveryCount 递增。
我怀疑在 EJB、JCA 或 JTA 规范(或 J2EE,就此而言)中的一个(或多个)中补充 JMS 规范有更多要求,我没有检查。
【讨论】:
4.4.15 Duplicate Production of Messages: JMS providers must never produce duplicate messages. This means that a client that produces a message can rely on its JMS provider to insure the consumers of the message will only receive it once. 这是关于AUTO_ACKNOWLEDGE 还是一般情况?因为在DUPS_OK_ACKNOWLEDGE 我认为JMS 提供者可以发送骗子。在 MDB 中,所有确认模式都被忽略。这就是为什么我有点困惑。