В нашем весеннем загрузочном приложении у нас есть пейджинговый цикл над базой данных, который будет отправлять JMS-сообщение для каждой страницы, используя JMSTemplate
.Метод, содержащий цикл - @Transactional
.JMSTemplate
создается с установленным значением 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
, используя CachingConnectionFactory
иsetSessionTransacted
до true
Теперь я не совсем уверен, как это отразится на транзакциях.Насколько я понимаю, все сообщения страницы N
отправляются в транзакции, созданной из loopThroughPages
, и после завершения метода loopThroughPages
он будет фиксировать все сообщения N
, а не после отправки каждого сообщения.Это также означает, что транзакция на стороне MQ будет оставаться открытой до тех пор, пока не будет обработана последняя страница.Это понимание правильно?