首页 > 解决方案 > Spring JMS DefaultMessageListener 和事务

问题描述

我的 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 为真。它还使用 mode(0) 创建一个 JMS 会话——SESSION_TRANSACTED

我显然错过了一些东西。

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

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

标签: spring-jms

解决方案


factory.setSessionTransacted(false);

你需要这样做 AFTER configurer.configure(factory, connectionFactory);,它有这个代码......

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

推荐阅读