...代码
@Transactional
@JmsListener(destination = "QueueA")
public void process(String input) {
doSomethingWhichMayThrowException(input);
}
考虑以下情况......
邮件丢失了吗?
如果不是,那么如何从交易中的队列中读取消息(步骤2)?
是否使用某种队列浏览器,以便从队列中读取消息但不消耗?
答案 0 :(得分:1)
邮件丢失了吗?
不,当事务回滚时,消息不会丢失。
如果不是,那么如何从事务中的队列中读取消息 (第2步)?
在消息监听器的process()/onMessage()
方法完成并返回成功或异常后,内部消息确认(默认为AUTO_ACKNOWLEDGE
)发生(这是最后一件事隐式发生)到JMS提供程序(IBMMQ,ActiveMQ,SonicMQ等),它告诉事务是否成功。
如果事务成功,JMS提供程序将从队列/主题中删除该消息。
如果事务未成功,JMS提供程序将按原样保留消息(直到消息TimetoLive
到期)。
是否使用某种队列浏览器,因此从队列中读取消息 没消耗?
您可以认为它就像队列浏览器概念,但它是由JMS提供程序实现的,它们如何在内部实现。为了实现这一点,消息代理只是读取消息内容,但是在从消息监听器的process()/ onMessage()方法收到确认之前,不要从队列/主题中删除实际消息。当前交易。