我有一个多个使用者正在监听一个队列,并且当一个消息到达它的onMessage()函数时被调用。由于有多个消费者,每个消费者都有自己的会话。要求是只有在没有问题且没有例外的情况下才应该确认消息......)与jms确认模式相关的混淆
AUTO_ACK模式:我的理解是:消息在onMessage成功完成后得到确认。如果onMessage()中有异常,则会重新传递消息。客户端确认:在onMessage()的结尾,我明确地调用了确认()。如果发生错误,则不会调用acknowledge()方法,因此消息将被重新发送。 事务处理会话:我在onMessage()函数末尾调用session.commit(),以防发生某种异常,并调用session.rollback,因此消息将被重新传递。
消费者可以检测到重复的消息并进行适当的处理。我的问题是,所有3种模式都在做同样的事情并解决我的目的,所以哪种方法比其他方法好,为什么?总之,为什么我应该通过客户端确认或自动模式使用事务处理会话。 我不想使用JTA/XA,因为它不受所有jms提供程序示例activeMQ支持,它会使我的应用程序变慢。
如果我的消费者无法处理重复消息,那么我明白我唯一的选择是使用JTA/XA,因为所有其他选项都会再次向我发送消息,这会导致重复处理。在JTA/XA中,我也可以再次得到消息,但它不会被认为是重复的处理,因为之前的事务会被回滚。
在auto ack你是什么意思由另一个clinet?正如我所提到的,每个消费者都有不同的会话,所以所有消费者的消息都不会出现。 – anuj
此外队列被配置为在10次尝试后消息进入DLQ。我主要担心的是,在目前的设置中,我没有看到这些模式的结果有什么不同,这是真的吗? – anuj