【问题标题】:Spring Boot JMS - when should a message be sent on a @Transacted method?Spring Boot JMS - 何时应在 @Transacted 方法上发送消息?
【发布时间】: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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我实际上只是想知道这种行为以及为什么它在每种情况下都不同,以及如果可能的话如何使其相同。
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多