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);
}
我的 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);
}