我的環境: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