首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring transaction handling JMSTemplate inside @transaction method

Spring transaction handling JMSTemplate inside @transaction method
EN

Stack Overflow用户
提问于 2018-12-20 15:56:31
回答 1查看 2.9K关注 0票数 3

在spring boot应用程序中,我们在数据库上有一个分页循环,它将使用JMSTemplate为每个页面发送一条JMS消息。包含循环的方法是@Transactional。创建JMSTemplate时,transacted标志设置为真。

我一直在浏览JMSTemplate的源代码,据我所知,如果已经有外部事务正在进行,它将不会提交事务会话,而是会将其放入该事务中。

现在让我们考虑以下代码:

代码语言:javascript
复制
@Transactional
public void loopThroughPages(String destination, String from, String to) {
    Pageable pageRequest = PageRequest.of(0, maxPageSize);
    Page<Event> eventPage;
    do {
       eventPage = eventRepo.getEventsInTimeRangeForDestination(from, to, destination, pageRequest);
       if(eventPage.hasContent()) {
          Message<String> eventMessage = buildEventMessage(eventPage.getContent());
          JmsTemplate template = queueService.createTemplate(destination);
          template.send(eventMessage);
          pageRequest = eventPage.nextPageable();
       }
    } while(pageRequest != null && eventPage.hasNext());
}

createTemplate使用CachingConnectionFactory和指向truesetSessionTransacted创建true

我现在不完全确定这是如何转化为交易的。我的理解是,所有N页面消息都是在从loopThroughPages创建的事务中发送的,一旦loopThroughPages方法完成,它将提交所有N消息,而不是在发送每个消息之后。这还意味着MQ端的事务将保持打开状态,直到处理完最后一个页面。这种理解是正确的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-20 17:55:39

这里的重点是传输管理。

如果您使用XA数据源并在spring boot应用程序上对其进行配置,那么您将拥有一个分布式事务,并且您的事务的提交/回滚将由spring管理,因为您有一个带有@ transaction注释的方法,否则您将拥有一个本地事务管理,并且您的数据库和消息传递系统的事务将不会同步。

对于发送消息,您可以通过属性配置消息是否持久,这意味着您的消息是否将由消息传递系统持久存储,而对于侦听器角度,您可以配置确认模式。顺便说一句,我的建议是让spring管理事务,一切都会好起来的,但真正值得注意的是,如果你想在数据库和jms系统之间建立一个分布式事务,你只需要配置它,atomikos就可以是一个可用的选项,否则就不需要手动管理事务,让Spring为你管理它就足够了。

我希望它能帮助你

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53864518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档