【问题标题】:How reliable is JMS rollback?JMS 回滚的可靠性如何?
【发布时间】:2016-11-01 11:59:36
【问题描述】:

代码...

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

考虑以下情况...

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

消息丢失了吗?

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

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

【问题讨论】:

  • 它取决于供应商,但通常它适用于从驱动程序到消息代理的 ack。

标签: java transactions jms spring-transactions spring-jms


【解决方案1】:

消息丢失了吗?

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

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

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

如果事务成功,JMS 提供者从队列/主题中删除消息。

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

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

你可以认为它就像队列浏览器的概念,但是这取决于 JMS 提供者的实现,他们如何在内部实现这一点。为了实现这一点,消息代理只读取消息内容,但在从消息侦听器的 process()/onMessage() 方法收到当前事务的确认之前,不要从队列/主题中删除实际消息。

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 2014-12-25
    • 2023-03-23
    • 1970-01-01
    • 2012-05-19
    • 2011-11-14
    • 2015-07-21
    • 2011-05-05
    • 2011-08-26
    相关资源
    最近更新 更多