JMS回滚的可靠性如何?

时间:2016-11-01 11:59:37

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

...代码

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

考虑以下情况......

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

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

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

1 个答案:

答案 0 :(得分:1)

  

邮件丢失了吗?

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

  

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

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

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

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

  

是否使用某种队列浏览器,因此从队列中读取消息   没消耗?

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