9.Транзакционность в JMS

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://community.ibm.com/community/user/integration/blogs/stephanie-wilkerson1/2021/02/25/understanding-mq-backout-queues-thresholds

https://www.ibm.com/docs/en/ibm-mq/9.2?topic=applications-handling-poison-messages-in-mq-classes-jms


(Просмотрено 481 раз, 1 раз за сегодня)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *