Spring事务在@Transactional方法中处理JMSTemplate

雅尼克·萨尔兹曼(Yanick Salzmann):

在我们的Spring Boot应用程序中,我们在数据库上有一个分页循环,它将使用来为每个页面发送JMS消息JMSTemplate包含循环的方法是@TransactionalJMSTemplate使用交易标记设为true 来创建。

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

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

@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一个创建DynamicJmsTemplate使用CachingConnectionFactorysetSessionTransactedtrue

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

瓦莱里奥·沃迪(Valerio Vaudi):

关键是传输管理。

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

对于发送消息,您可以通过属性配置消息是否持久化,这意味着消息系统是否可以持久化消息,而对于侦听器而言,您可以配置确认模式。顺便说一下,我的建议是让弹簧管理事务,但一切都会很好,但真正的注意点是,如果要在数据库和jms系统之间进行分布式事务,则只需配置它即可,atomikos可以是一个可用选项,否则无需手动管理交易就足够了,让Spring来为您管理。

希望对您有所帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在另一个实例中从事务方法调用spring Non-Transactional方法时,事务是否传播?

Scala Play with Slick中的事务方法(类似于Spring @Transactional,也许吗?)

从调用非事务性方法的@Transactional方法在Spring 4.3

Spring JMSTemplate在一个事务中接收所有消息

Spring @Transactional方法错误处理

Spring管理的事务@Transactional批注

在Spring数据中处理并发事务

在Spring-Boot中处理并发事务

@Transactional 中的事务隔离级别

Java Spring 4 @Transactional嵌套事务问题

使用Java Spring和Hibernate和EntityManager在@Transactional方法中进行事务提交的问题

方法必须在事务上下文之外调用-Spring @Transactional

Spring @Transactional一次方法的一次事务

如何在Spring中处理具有并发访问的事务

Spring Integration中如何处理嵌套事务异常

在StepExecutionListener中的Spring批处理事务

在现有类中实现Spring事务处理

声明式事务(@Transactional)在Spring中不适用于@Repository

如何对单个事务多次调用@Transactional方法

Spring @Transactional方法问题

Spring @Transactional会在异常发生时持续回滚事务

Spring Service @Transactional不会回滚事务Mybatis SqlSession

没有@Transactional批注的Spring托管事务

Spring 集成:是否可以在 ServiceActivator 方法中实现事务?

如何在Spring Data REST中处理同一事务中的多个实体更新

Spring Boot - 我是否必须标记使用事务处理和保存数据的方法?

Spring @Transactional方法-参与交易

在类与方法上的Spring @Transactional

Spring @Transactional方法和类