spring-jms - 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
解决方案
factory.setSessionTransacted(false);
你需要这样做 AFTER configurer.configure(factory, connectionFactory);
,它有这个代码......
if (this.transactionManager != null) {
factory.setTransactionManager(this.transactionManager);
}
else {
factory.setSessionTransacted(true);
}
推荐阅读
- mysql - SELECT 显示一个包含列名而不是里面的数据的列表
- python - 如何使用 Sympy 在 Python 中使用 while 循环对等式进行 5 次微分,每次运行微分一次?
- arrays - 从数组 c 中选择随机线
- html - 儿童定位的宽度百分比标准是什么:绝对
- ssl - Hostgator:SSL 信息在我的服务器上 SSL/TSL 管理器和 SiteLock/其他任何地方不匹配
- python - Python语法问题 - 变量名前的冒号
- java - 有没有一种简单的方法来编写这段代码?
- python - 使用包含多个值的列从 DataFrame 创建 Edgelist
- r - 对热图的单元格进行排序
- jquery - 添加样式时 Tinymce 自定义占位符不起作用