我使用Spring DefaultMessageListenerContainer和JMS Message Listener来使用来自Solace Queue的消息。 Client Acknowledgement设置为true。
如果异常消息保留在队列中,因为它们未被确认,并且这些消息未被重新传递。处理异常后泵送的新消息。
已阅读有关使用session.recover的内容,但我们如何处理会话。还尝试将maxredelivery设置为3。但是没有工作。
public void onMessage(Message message) {
String text = null;
ALNTLogger.trace(CLAZZ_NAME, "onMessage()", "Message Received:");
try {
TextMessage textMessage = (TextMessage) message;
text = textMessage.getText();
ALNTLogger.trace(CLAZZ_NAME, "onMessage()", "Message Received: " + text);
Document xmlDocument = parseXml(text);
Map < String, String > values = getValues(xmlDocument);
saveValues(values);
message.acknowledge();
} catch (Exception ex) {
ALNTLogger.error(CLAZZ_NAME, "onMessage()", "Failed to process message:" + text);
throw new RuntimeException(ex);
}
}
任何帮助将不胜感激
答案 0 :(得分:2)
当使用CLIENT_ACKNOWLEDGE确认模式和DefaultMessageListenerContainer时,预计不会重新传递消息。
Spring文档说明了以下内容:
侦听器容器提供以下消息确认 选项:
- “sessionAcknowledgeMode”设置为“AUTO_ACKNOWLEDGE”(默认值): 在侦听器执行之前自动确认消息;没有 如果抛出异常,则重新发送。
- “sessionAcknowledgeMode”设置 到“CLIENT_ACKNOWLEDGE”:自动消息确认后 成功的听众执行;如果发生例外情况,则不得重新发送 抛出。
- “sessionAcknowledgeMode”设置为“DUPS_OK_ACKNOWLEDGE”:懒惰 在监听器执行期间或之后的消息确认;潜在 如果抛出异常,则重新发送。
- “sessionTransacted”设置为 “true”:成功收听后的交易确认 执行;如果发生异常,保证重新发送。
您可以使用最后一个选项,即事务确认,以便在onMessage()方法无法正常返回时重新传递消息。