【发布时间】:2017-04-16 15:59:26
【问题描述】:
我的环境:spring 4.1,JBoss EAP 6.4,IBM MQ 8.0:
在Listener 抛出RuntimeException 的情况下不会重新传递消息。
我在JmsConfig中有以下内容:
@Bean
DefaultMessageListenerContainer defaultMessageListenerContainer(QueueConnectionFactory connectionFactory, JndiDestinationResolver dr, MessageListener ml) {
DefaultMessageListenerContainer mlc = new DefaultMessageListenerContainer();
mlc.setConnectionFactory(connectionFactory);
mlc.setMessageListener(ml);
mlc.setDestinationName(jndiInQueue);
mlc.setDestinationResolver(dr);
mlc.setSessionTransacted(true);
mlc.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return mlc;
}
如果我使用JmsTransactionManager 并将其传递给上述方法并像这样使用:
mlc.setTransactionManager(tm)
以下警告被写入日志:
It is not valid to commit a non-transacted session,行为相同,不重发。
ConnectionFactory是通过JNDI获取的,不知通过jndi获取ConnectionFactory是否与此有关?
来自AbstractMessageListenerContainer Javadocs:
为了始终如一地安排任何容器变体的重新交付,请考虑“CLIENT_ACKNOWLEDGE”模式或 - 最好 - 将“sessionTransacted”设置为“true”
在 SO 上有一个similar question。
【问题讨论】:
标签: spring jms jndi ibm-mq spring-jms