我的环境:spring 4.1
,JBoss EAP 6.4
,IBM MQ 8.0
:春JMS消息重新传递工作不正常的CLIENT_ACKNOWLEDGE模式
消息未在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
Javadoc中:
为了始终如一地与任何容器的变体还船安排,考虑“CLIENT_ACKNOWLEDGE”模式或 - 优选 - 设定“sessionTransacted”为“真”,而不是
SO上有一个similar question。
我曾尝试Session.SESSION_TRANSACTED,没有工作。 – kmansoor