gpt4 book ai didi

java - @Transactional 方法中的 Spring 事务处理 JMSTemplate

转载 作者:行者123 更新时间:2023-11-30 01:57:35 27 4
gpt4 key购买 nike

在我们的 Spring Boot 应用程序中,我们在数据库上有一个分页循环,它将使用 JMSTemplate 为每个页面发送一条 JMS 消息。包含循环的方法是@Transactional。 JMSTemplate 是在事务标志设置为 true 的情况下创建的。

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

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

@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 创建一个 DynamicJmsTemplate,并将 setSessionTransacted 设置为 true

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

最佳答案

这里的关键点是 Transastion 管理。

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

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

希望对你有帮助

关于java - @Transactional 方法中的 Spring 事务处理 JMSTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53864518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com