Java JMS回滚的可靠性如何?

Java JMS回滚的可靠性如何?,java,transactions,jms,spring-transactions,spring-jms,Java,Transactions,Jms,Spring Transactions,Spring Jms,代码 考虑以下情况,其中 事务已启动(使用Spring@Transactional注释) 从队列A读取持久JMS消息(队列使用磁盘作为消息存储) 磁盘已满,不接受任何写入操作 发生异常并回滚事务 消息丢失了吗 若不是,那个么如何从事务下的队列读取消息(步骤2) 是否使用了某种队列浏览器,以便从队列中读取消息但不使用 消息丢失了吗 否,事务回滚时消息不会丢失 若不是,那个么如何从事务下的队列读取消息 (步骤2) 消息侦听器的process()/onMessage()方法完成并返回成功或异常后,J

代码

考虑以下情况,其中

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

  • 消息丢失了吗

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

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

    消息丢失了吗

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

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

    消息侦听器的
    process()/onMessage()
    方法完成并返回成功或异常后,JMS提供程序(IBMMQ、ActiveMQ、SonicMQ等)将发生内部消息确认(默认为
    AUTO_ACKNOWLEDGE
    )操作(这是隐式发生的最后一件事)这表明交易成功与否

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

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

    是否使用某种队列浏览器,以便从队列中读取消息,但 没有消费


    您可以认为这类似于队列浏览器的概念,但这取决于JMS提供程序的实现,他们如何在内部实现这一点。为了实现这一点,message broker只读取消息内容,但在从当前事务的message listener的process()/onMessage()方法收到确认之前,不要从队列/主题中删除实际消息。

    它依赖于供应商,但通常使用从驱动程序到messagebroker的ack。
    @Transactional
    @JmsListener(destination = "QueueA")
    public void process(String input) {
      doSomethingWhichMayThrowException(input);
    }