当前位置: 首页 > 知识库问答 >
问题:

JMS回滚的可靠性如何?

松骏俊
2023-03-14

密码

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

考虑以下情况...

  1. 事务已启动(使用Spring@Transactional annotation)

消息丢失了吗?

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

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

共有1个答案

陶博涉
2023-03-14

消息丢失了吗?

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

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

消息侦听器的process()/onMessage()方法完成并返回成功或异常后,JMS提供程序(IBMMQ、ActiveMQ、SonicMQ等)会发生内部消息确认(默认值为AUTO_ACKNOWLEDGE)这说明交易成功与否。

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

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

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

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

 类似资料:
  • 我正在使用对象中的函数来获取特定日期时间的Utc偏移值。通常,夏令时会遵循特定的规则,例如“从10月的第一个星期日开始,到4月的第一个星期日结束”(澳大利亚东部标准时间),所以我相信函数产生的结果。 但我确实想知道,如果政府的决定推迟或改变夏令时,结果会怎样?在过去,有几次(澳大利亚)政府违反了某些活动的夏令时规则。在这些情况下,调用是否会产生错误的结果,或者库是否足够聪明,可以“偶尔”从inte

  • 所以我的问题是:

  • 可靠性指标 很多领域一般都喜欢谈服务可靠性,用几个 9 来说事。这几个 9 其实是粗略代表了概率意义上系统能提供服务的可靠性指标,最初是电信领域提出的概念。 下表给出不同指标下,每年允许服务出现不可用时间的参考值。 指标 概率可靠性 每年允许不可用时间 典型场景 一个九 90% 1.2 个月 不可用 二个九 99% 3.6 天 普通单点 三个九 99.9% 8.6 小时 普通企业 四个九 99.9

  • 应用程序中的工作版本 IBM AllClient版本:'com.ibm.mq:com.ibm.mq.AllClient:9.1.1.0' org.springframework:spring-jms:4.3.9.发布 javax.jms:javax.jms-api:2.0.1 我的要求是,如果由于消费者不可用(例如DB不可用)而导致消息处理失败,则消息保留在队列中或放回队列中(如果可能的话)。这是

  • 假设我使用 ScheduledThreadPoolExecutor 计划了一个任务,并找回了一个 Future。 我后来决定要取消该 Future,并依靠取消的返回值来触发一些清理操作。如果任务已经在运行,我不希望它被中断(所以我将false作为参数传递)。 取消的返回可靠吗?也就是说,如果取消返回“true”,任务是否可能实际上正在运行? 查看OpenJDK 8中的代码,看起来可能存在竞争条件,

  • Liquibase在Java世界中类似于EntityFramework(EF)。并且=在中。但问题是只生成,但没有回滚。有可能在回滚的同时生成差异吗? 我试着用liquibase:rollback创建回滚脚本。但它并不能在所有情况下都生成回滚脚本,例如,当我删除了一个带有更改集的列,然后想要回滚时。设置或运行时出错