Spring Boot JMS-什么时候应该在@Transacted方法上发送消息?

时间:2018-08-17 23:12:21

标签: java spring mongodb spring-boot jms

我想知道标记为@Transactional的Spring Boot方法何时应该在队列中显示一条消息?我问是因为我注意到2个不同的应用程序有2个不同的行为。

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

  • 基于Spring Boot 2.0
  • JMS消息发送使用JmsTemplate,并且setSessionTransacted设置为true
  • 未配置任何明确的交易设置
  • 使用了一个Mongo数据库(使用Spring Data),并且正在使用与发送消息相同的方法来修改记录

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

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

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

这是预期的行为吗?

我可以配置应用程序使其行为相同吗?理想情况下,我希望在最后发送消息(因此,任何失败的Mongo更改都会取消消息发送并回滚所做的任何JPA更改)?我意识到Mongo更改不属于任何创建的交易。

谢谢

1 个答案:

答案 0 :(得分:0)

使用JMS和数据库,您必须获得资源。

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

如果即使最后一次发送消息时也没有此功能,但发送失败,无论如何数据库中的数据都会更改。

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

使用JMS和数据库,您必须获得资源。要拥有完整的交易行为,您需要分布式交易。我们在应用程序中使用了Bistronix,效果很好。

看看文档:{​​{3}}