JMS 回滚有多可靠?
How reliable is JMS rollback?
代码...
@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()
方法完成并且 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() 方法收到确认为止.
代码...
@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()
方法完成并且 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() 方法收到确认为止.