代码...
@Transactional
@JmsListener(destination = "QueueA")
public void process(String input) {
doSomethingWhichMayThrowException(input);
}
考虑以下情况...
- 事务已启动(使用 Spring @Transactional 注释)
- 从QueueA读取持久JMS消息(队列使用磁盘作为消息存储)
- 磁盘已满,不接受任何写入操作
- 发生异常,事务回滚
消息丢失了吗?
如果不是,那么如何从事务下的队列中读取消息(步骤 2)?
是否使用某种队列浏览器,以便从队列中读取消息但不使用消息?
最佳答案
Is message lost?
不,消息不会随着事务回滚而丢失。
If it's not then how message is read from queue under transaction (step 2) ?
一旦消息监听器的process()/onMessage()
之后方法完成并返回成功或异常,然后 JMS 提供者(IBMMQ、ActiveMQ、SonicMQ 等)发生内部消息确认(默认为 AUTO_ACKNOWLEDGE
)(这是隐式发生的最后一件事) ..) 告诉交易是否成功。
如果事务成功,JMS 提供程序将从队列/主题中删除该消息。
如果事务不成功,JMS 提供程序将按原样保留消息(直到消息 TimetoLive
过期)。
Is some kind of a queue browser used so message is read from queue but not consumed ?
您可以认为这就像队列浏览器概念,但这取决于 JMS 提供者的实现,他们如何在内部实现这一点。为了实现这一点,消息代理只读取消息内容,但不会从队列/主题中删除实际消息,直到从消息监听器的 process()/onMessage() 方法收到当前事务的确认。
关于java - JMS回滚有多可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40359626/