2013-08-28 43 views
0

我遇到了使用消息使用者(javax.jms.MessageConsumer)从队列中读取消息的情况。 使用的会话使用AUTO_ACKNOWLEDGE模式。使用消息使用者时的JMS自动确认

从我至今在AUTO_ACK模式阅读:

在如果消费者的onMessage()方法完成,没有错误的消息被认为是接收并成功处理的自动确认,它会被去掉,然后来自JMS服务器。

我的问题是被认为由JMS生产者考虑我真的不使用具有一个onMessage()方法一个MDB而是通过使用前面所述的消息用户读取消息是ACK消息时。

当我使用messageConsumer成功读取消息后,消息是否已确认? 如果进一步向下逻辑链,使用相应消息的方法会引发错误,会发生什么?那个时候消息已经被确认了吗?

回答

1

为AUTO_ACKNOWLEDGE不变的Javadoc这样说:

与此确认模式下,会话自动确认 客户端的接收消息既可以当会话 成功地从调用返回接收或当会话已调用的消息 侦听器成功处理消息 返回。

我怀疑你是在MessageConsumer上调用receive(虽然你没有明确说明),所以如果你设置了AUTO_ACKNOWLEDGE它会被接收返回的时间所确认。

当然,如果您有一个事务处理会话,那么确认模式将被忽略,并且在会话提交之前不会收到该消息。

+0

是的,我打电话receiveNoWait。 – Sergiu