Моя среда: spring 4.1
, JBoss EAP 6.4
, IBM MQ 8.0
:Spring JMS Message Redelivery не работает, как ожидалось в режиме 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)
После предупреждения записываются в log:
It is not valid to commit a non-transacted session
, и поведение такое же, никакой redeliver у.
ConnectionFactory
получено через JNDI
, интересно, может ли поиск ConnectionFactory
через jndi?
От AbstractMessageListenerContainer
Javadocs:
Для того, чтобы последовательно организовать для возврата судна с любым контейнерным вариантом, рассмотрят режим "CLIENT_ACKNOWLEDGE" или - предпочтительно - установку "sessionTransacted" к "истинной" вместо
Существует similar question на SO.
Я попробовать Session.SESSION_TRANSACTED, не работает. – kmansoor