Spring JMS DefaultMessageListener и транзакции - PullRequest
1 голос
/ 20 сентября 2019

Мой bean-компонент DefaultMessageListernerFactory выглядит как

@Bean
  public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory,
      DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
   factory.setSessionTransacted(false);
   factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
    factory.setErrorHandler(new DefaultJMSErrorHandler());
    configurer.configure(factory, connectionFactory);
    return factory;
  }

При использовании @JmsListener и когда мое приложение выдает исключение - я ожидал, что мое сообщение НЕ будет возвращено обратно, но я заметил, что это так.Я думал, что sessionTransaction (false) не должен демонстрировать это поведение.

Я заметил, что мои журналы транзакций говорят это

2019-09-20 14:22:42.609 DEBUG 17252 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer  : Initiating transaction rollback on application exception

Во время отладки я заметил, что DefaultMessageListner имеет sessionTransacted, чтобы быть истинным.Он также создает сеанс JMS с режимом (0) - SESSION_TRANSACTED

Я явно что-то упустил.

Может кто-нибудь сказать мне, что мне здесь не хватает?

К вашему сведению - я использую IBM MQ

1 Ответ

0 голосов
/ 20 сентября 2019

factory.setSessionTransacted(false);

Вам нужно сделать это ПОСЛЕ configurer.configure(factory, connectionFactory);, который имеет этот код ...

        if (this.transactionManager != null) {
            factory.setTransactionManager(this.transactionManager);
        }
        else {
            factory.setSessionTransacted(true);
        }
...