JMS 回滚有多可靠?

How reliable is JMS rollback?

代码...

@Transactional
@JmsListener(destination = "QueueA")
public void process(String input) {
  doSomethingWhichMayThrowException(input);
}

考虑以下情况...

  1. 交易开始(使用Spring@Transactional注解)
  2. 从 QueueA 读取持久 JMS 消息(队列使用磁盘作为消息存储)
  3. 磁盘已满,不接受任何写操作
  4. 异常发生,事务被回滚

消息丢失了吗?

如果不是,那么如何从事务下的队列中读取消息(第 2 步)?

是否使用了某种队列浏览器以便从队列中读取消息但不使用消息?

Is message lost?

不,消息不会在事务回滚时丢失。

If it's not then how message is read from queue under transaction (step 2) ?

在消息侦听器的 process()/onMessage() 方法完成并且 returns 成功或异常后,内部消息确认(默认为 AUTO_ACKNOWLEDGE)发生(这是最后一件事 隐式发生) 到 JMS 提供者(IBMMQ、ActiveMQ、SonicMQ 等),它告诉交易是否成功。

如果事务成功,JMS 提供程序将从 queue/topic 中删除消息。

如果事务不成功,JMS 提供程序将按原样保留消息(直到消息 TimetoLive 过期)。

Is some kind of a queue browser used so message is read from queue but not consumed ?

您可以认为它类似于队列浏览器的概念,但这取决于 JMS 提供程序的实现,他们如何在内部实现它。为了实现这一点,消息代理只读取消息内容,但不会从 queue/topic 中删除实际消息,直到从当前事务的消息侦听器的 process()/onMessage() 方法收到确认为止.