9.Транзакционность в JMS
Транзакционность используется для возвращения сообщения обратно в очередь, в случае возникновения исключения при его обработке. Для настройки транзакционности, нужно указать ContainerFactory бину — бин PlatformTransactionManager. Пример настроек JMS:
/**
* Бин для создания соединения с брокером очередей
*/
@Bean
public ConnectionFactory connectionFactory(MQConfigurationProperties configProperties) {
return new MQConnectionFactoryFactory(configProperties, null)
.createConnectionFactory(MQConnectionFactory.class);
}
/**
* Бин для настройки контекста обмена сообщениями (тип, конвертация, транзакционность, кэширование, таймауты, обработка ошибок)
*/
@Bean
public DefaultJmsListenerContainerFactory jmsContainer(ConnectionFactory connectionFactory, PlatformTransactionManager transactionManager) {
DefaultJmsListenerContainerFactory listenerContainer = new DefaultJmsListenerContainerFactory();
//Устанавливаем connectionFactory
listenerContainer.setConnectionFactory(connectionFactory);
//Устанавливаем менеджер транзакций
listenerContainer.setTransactionManager(transactionManager);
return listenerContainer;
}
/**
* Бин менеджера транзакций
*/
@Bean
public PlatformTransactionManager transactionManager(ConnectionFactory connectionFactory) {
JmsTransactionManager transactionManager = new JmsTransactionManager();
transactionManager.setConnectionFactory(connectionFactory);
return transactionManager;
}
Для того, чтобы rollback сообщения сработал, достаточно чтобы из метода помеченного @JmsListener выбросилось необработанное исключение.
Таким образом, исходное сообщение снова появится в очереди и его хэадер JMSXDeliveryCount увеличится на 1.
Но здесь есть сайд-эффект, т.к. это сообщение через секунду снова залетит в приложение. Таким образом, если исключение будет постоянно появляться — мы попадём в бесконечный цикл ( есть способ задержки принятия следующего Jms сообщения после ошибки ).
По поводу транзакционности, есть пара статуй от IBM:
https://www.ibm.com/docs/en/ibm-mq/9.2?topic=applications-handling-poison-messages-in-mq-classes-jms