【发布时间】:2018-12-20 07:56:30
【问题描述】:
在我们的 Spring Boot 应用程序中,我们在数据库上有一个分页循环,它将使用 JMSTemplate 为每个页面发送一条 JMS 消息。包含循环的方法是@Transactional。 JMSTemplate 是在将 transacted 标志设置为 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 使用CachingConnectionFactory 和setSessionTransacted 创建DynamicJmsTemplate 到true
我现在不完全确定这如何转化为交易。我的理解是,所有N 页面消息都是在从loopThroughPages 创建的事务中发送的,一旦loopThroughPages 方法完成,它将提交所有N 消息,而不是在发送每条消息之后。这也意味着 MQ 端的事务将保持打开状态,直到处理完最后一页。这种理解正确吗?
【问题讨论】:
-
我在
JmsTemplate中删除了我对commit和close的评论,因为它不一定会关闭它获得的Session,除非它无法从@987654339 获得事务会话@
标签: java spring transactions jms