java - JMS回滚有多可靠?

标签 java transactions jms spring-transactions spring-jms

代码...

@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()之后方法完成并返回成功或异常,然后 JMS 提供者(IBMMQ、ActiveMQ、SonicMQ 等)发生内部消息确认(默认为 AUTO_ACKNOWLEDGE )(这是隐式发生的最后一件事) ..) 告诉交易是否成功。

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

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

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

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

关于java - JMS回滚有多可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40359626/

相关文章:

.net - SQL中默认的最大事务超时是多少

python - 属性错误 : _nanosecond when updating a datetime in transaction

java - 如何在Java EE环境中使用JMS和JPA处理事务回滚?

java - IBM MQ Server 8.0.0.4 客户端库

jakarta-ee - MDB 和 JMS 之间的区别

java - Java 数组和列表的共同祖先

java - Spring MVC 基于注释的配置不起作用

java - 从 getter 方法获取数据而不是传入 Bundle

jakarta-ee - 将 JMS 应用程序移植到 MQ

java - 如何从Java获取Linux机器的实际IP