Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee MDB和dupe消息_Jakarta Ee_Ejb_Message Driven Bean - Fatal编程技术网

Jakarta ee MDB和dupe消息

Jakarta ee MDB和dupe消息,jakarta-ee,ejb,message-driven-bean,Jakarta Ee,Ejb,Message Driven Bean,让我们假设MDB已接收到一条消息,并已开始在CMT/Required事务中处理该消息,并假设该事务可能需要一些时间才能完成 在这种情况下,当第一个事务仍在进行中时,另一个MDB实例是否可能在另一个事务中接收并处理重复消息 或者,容器是否能确保当MDB忙于处理CMT/Required事务中的消息时,其他MDB实例不会收到该消息的副本?我希望在事务的一部分时锁定任何消息,并且不应发送副本,因为JMS规范要求: 4.4.15信息的重复生成: JMS提供程序决不能生成重复的消息。这意味着 生成消息的客户

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

在这种情况下,当第一个事务仍在进行中时,另一个MDB实例是否可能在另一个事务中接收并处理重复消息


或者,容器是否能确保当MDB忙于处理CMT/Required事务中的消息时,其他MDB实例不会收到该消息的副本?

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

4.4.15信息的重复生成: JMS提供程序决不能生成重复的消息。这意味着 生成消息的客户端可以依赖其JMS提供程序来确保 消息的使用者只会收到一次

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


我怀疑在一个(或多个)EJB、JCA或JTA规范(或J2EE规范)中有更多的需求来补充JMS规范,我还没有检查

4.4.15消息的重复生成:JMS提供程序不得生成重复消息。这意味着生成消息的客户端可以依赖其JMS提供程序来确保消息的使用者只接收一次。
这是关于
自动确认还是一般情况?因为在
DUPS\u OK\u ACKNOWLEDGE
中,我认为JMS提供者可以发送DUPS。在MDB中,所有确认模式都被忽略。这就是为什么我有点困惑,将军。4.4.15仅适用于工作单元范围内;在事务回滚的情况下,消息可以多次传递到MDB。但在交易被撤销之前,您只能获得一份副本。至于DUPS_OK,它向提供程序表明它可以执行延迟确认,如果发生崩溃,则可能无法记录确认,并且消息可能在重新启动后重新传递。通过设置DUPS_OK,客户机表示不介意以这种方式进行复制。但这不适用于XA/MDB案例。4.4.15指的是消息的生成,而不是传递。在4.4.14中提到,在自动确认模式下,最后消耗的消息可能会被重新发送。在XA(即,必需)下,确认模式被忽略,但4.4.15是相关的-在事务进行中,提供商不得发送另一份副本。因此,回到您原来的问题,不可能“在另一个事务中由另一个MDB实例接收和处理重复消息,而第一个事务仍在进行中”,因为提供者不能这样做。如果第一个事务失败,消息将被重新传递。请注意JMS规范对事务完整性和自动确认的评论-它们不一样。我认为4.4.15是指生产者/发行者生成和发送消息,而不是消费者/订阅者接收消息。