Для синхронизации транзакций DataSource и JMS мне нужно настроить setTransacted в JmsTemplate в дополнение к JmsTransactionManager? - PullRequest
2 голосов
/ 30 сентября 2019

Мне нужно синхронизировать прием сообщений, сохранение в базе данных и отправку другого сообщения, все в одной транзакции. Я использую 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.

  1. Нужно ли явно настраивать компонент JmsTemplate с setSessionTransacted(true) или этого достаточно для моей текущей конфигурации транзакции?

  2. Чторазница между настройкой JmsTemplate.setSessionTransacted(true) и использованием ChainedTransactionManager + JmsTransactionManager?

...