让我们假装MDB收到了一条消息,并且已经开始在CMT / Required事务中处理它,让我们假设该事务可能需要一些时间才能完成。
在这种情况下,是否有可能在另一个事务中由另一个MDB实例接收和处理重复消息,而第一个事务仍在进行中?
或者容器是否确保当MDB忙于处理CMT / Required事务中的消息时,没有其他MDB实例会收到同一消息的欺骗行为?
答案 0 :(得分:0)
我希望在事务的一部分时锁定任何消息,并且不应发送重复项,因为JMS规范要求:
4.4.15重复制作讯息: JMS提供者绝不能生成重复的消息。这意味着一个 产生消息的客户端可以依赖其JMS提供程序来保证 消息的消费者只会收到一次。
所以我认为您可以依赖消息传递提供程序来确保MDB不会收到消息的第二个副本,除非第一个显式回滚或事务超时并隐式回滚。这两个操作都应该“解锁”消息并使其可用于重新传递到MDB,JMSRedelivered设置为true并且JMSXDeliveryCount递增。
我怀疑在一个(或多个)EJB,JCA或JTA规范(或J2EE)中有更多要求来补充JMS规范,我还没有检查过。