我想知道标记为 @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/