消费者选择的JMS单消息确认

时间:2012-12-07 21:40:25

标签: transactions jms ack

使用JMS队列考虑以下场景:我们有一个带有队列Q的JMS代理B和使用Session S1创建的MessageConsumer C1。 C1通过onMessage()方法调用(异步)接收消息M1,M2,M3,并启动线程T1,T2,T3,以便并行处理M1,M2,M3(分别)。我们不知道完成T1,T2,T3的任何时间需要多少时间。在某个时间点T2是完成执行的第一个线程:是否有可能以这样的方式向代理B确认(或提交)M2,如果会话S1很快关闭,那么M1和M3将由B并重新交付给另一个会话S2和另一个消费者C2?

Session.CLIENT_ACK不是我们需要的,一些JMS实现的SINGLE_ACK可能是我正在寻找的,但它不是JMS标准。也许JMS事务可以解决问题吗?

1 个答案:

答案 0 :(得分:-1)

Message接口定义acknowledge,允许确认单个消息。所以你可以在T2中调用message.acknowledge

作为旁注:您的onMessage()回调可能已经从多个线程调用,具体取决于您的JMS提供程序的实现。