Spring JMS DefaultMessageListener 和事务

Spring JMS DefaultMessageListener and Transactions

我的 DefaultMessageListernerFactory bean 看起来像

@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 为真。它还会创建模式为 (0) 的 JMS 会话 -- SESSION_TRANSACTED

我显然遗漏了一些东西。

有人可以告诉我我在这里缺少什么吗?

仅供参考 -- 我正在使用 IBM MQ

factory.setSessionTransacted(false);

您需要在 configurer.configure(factory, connectionFactory); 之后执行此操作,其中包含此代码...

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