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