Мне нужно синхронизировать прием сообщений, сохранение в базе данных и отправку другого сообщения, все в одной транзакции. Я использую Spring Boot и полагаюсь на его автоконфигурацию. Посредником сообщений является Active MQ.
Для моего случая использования достаточно 1-фазной фиксации с максимальным усилием, поэтому я настроил ChainedTransactionManager
:
@EnableTransactionManagement
@Configuration
public class TransactionConfiguration {
@Bean
public PlatformTransactionManager chainedTransactionManager(DataSourceTransactionManager dtm,
JmsTransactionManager jtm) {
return new ChainedTransactionManager(jtm, dtm);
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public JmsTransactionManager jmsTransactionManager(ConnectionFactory connectionFactory) {
return new JmsTransactionManager(connectionFactory);
}
}
Поток приложения будетчто-то вроде этого:
private final JmsTemplate jmsTemplate;
private final MessageRepository messageRepository;
@Transactional
@JmsListener(destination = "someDestination")
public void process(Message message){
jmsTemplate.isSessionTransacted();
//Save to DB
messageRepository.save(message);
//Send to another queue
jmsTemplate.convertAndSend("anotherDestination", new ProcessedMessage(message));
}
Внутри process()
метода я видел, что jmsTemplate.isSessionTransacted();
- это false
.
Нужно ли явно настраивать компонент JmsTemplate
с setSessionTransacted(true)
или этого достаточно для моей текущей конфигурации транзакции?
Чторазница между настройкой JmsTemplate.setSessionTransacted(true)
и использованием ChainedTransactionManager
+ JmsTransactionManager
?