java - Spring Boot JMS - 何时应在 @Transacted 方法上发送消息?

标签 java spring mongodb spring-boot jms

我想知道标记为 @Transactional 的 Spring Boot 方法,消息何时应该出现在队列上?我这么问是因为我注意到 2 个不同的应用程序有 2 个不同的行为。

这两个应用程序有以下共同点:

  • 基于 Spring Boot 2.0
  • JMS 消息发送使用 JmsTemplate,setSessionTransacted 设置为 true
  • 未配置明确的事务设置
  • 使用了 Mongo DB(使用 Spring Data),并且正在以与发送消息相同的方法修改记录

这两个应用程序之间的主要区别是:

  • 其中一个应用程序有 JPA 数据源(使用 Spring Dataj,并在此方法中读取和/或写入记录。另一个应用程序没有此数据源。

观察到的行为的差异在于,当 JPA 源存在时,消息在方法末尾发送。如果没有它,消息将立即发送。

这是预期的行为吗?

我可以将应用程序配置为以相同的方式运行吗?理想情况下,我希望消息在最后发送(这样任何失败的 Mongo 更改都会取消消息发送并回滚所做的任何 JPA 更改)?我意识到 Mongo 更改不是创建的任何事务的一部分。

谢谢

最佳答案

使用 JMS 和数据库,您将拥有两种资源。

要拥有完整的事务行为,您需要分布式事务支持。

如果您没有此信息,即使消息作为最后一个操作发送,如果发送失败,数据库中的数据仍然会更改。

要配置分布式事务,您需要 JTA。此处对此进行了描述:

使用 JMS 和数据库,您将拥有两种资源。要拥有完整的事务行为,您需要分布式事务。我们在应用程序中使用 Bistronix,效果非常好。

查看文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html

关于java - Spring Boot JMS - 何时应在 @Transacted 方法上发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51903849/

相关文章:

javax打印总是双面的

java - 在 REST API 中使用 GET 请求放置许多请求参数

java - 如何使用 MockMvc 为 POST 提供请求参数

java - 如何在没有测试范围 jar 的情况下进行 Maven 安装

java - 谁能解释一下这里发生了什么 : "protected" modifier in java

java - 将@RequestParam 用于多部分文件是正确的方法吗?

Spring Boot Actuator 'http.server.requests' 公制 MAX 时间

javascript - 如何在 Mongoose 排序结束时保留空值?

javascript - Mongoose: TypeError: 无法读取未定义的属性 'findOne'

java - Mongo Jackson Mapper 按 id 结果删除