【发布时间】:2018-08-17 23:12:21
【问题描述】:
我想知道标记为@Transactional 的Spring Boot 方法,消息何时应该出现在队列中?我之所以这么问,是因为我注意到 2 个不同的应用程序有 2 种不同的行为。
这两个应用程序有以下共同点:
- 基于 Spring Boot 2.0
- JMS 消息发送使用 JmsTemplate,setSessionTransacted 设置为 true
- 未配置显式事务设置
- 使用了 Mongo DB(使用 Spring Data)并且正在以与发送消息相同的方法修改记录
这两个应用程序的主要区别是:
- 一个有 JPA 数据源(使用 Spring Dataj 并在此方法中读取和/或写入记录。另一个应用程序没有此数据源。
观察到的行为的不同之处在于,当 JPA 源存在时,消息在方法结束时发送。没有它,消息会立即发送。
这是预期的行为吗?
我可以将应用程序配置为相同的行为方式吗?理想情况下,我希望消息在最后发送(因此任何失败的 Mongo 更改都会取消消息发送并回滚所做的任何 JPA 更改)?我意识到 Mongo 更改不是创建的任何事务的一部分。
谢谢
【问题讨论】:
标签: java spring mongodb spring-boot jms