2

我正在使用 Spring DefaultMessageListenerContainer 和 JMS 消息侦听器来使用来自 Solace Queue 的消息。客户端确认设置为真。

如果出现异常消息,则由于未确认且未重新传递,因此消息仍保留在队列中。处理异常后抽取的新消息。

已阅读有关使用 session.recover 的信息,但我们如何处理 session 。还尝试将 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);
 }
} 

任何帮助将不胜感激

4

1 回答 1

1

当使用带有 DefaultMessageListenerContainer 的 CLIENT_ACKNOWLEDGE 确认模式时,预计不会重新传递消息。

Spring 文档声明如下:

侦听器容器提供以下消息确认选项:

  • “sessionAcknowledgeMode”设置为“AUTO_ACKNOWLEDGE”(默认):在监听器执行前自动确认消息;在抛出异常的情况下不重新投递。
  • “sessionAcknowledgeMode”设置为“CLIENT_ACKNOWLEDGE”:监听器执行成功后自动消息确认;在抛出异常的情况下不重新投递。
  • “sessionAcknowledgeMode”设置为“DUPS_OK_ACKNOWLEDGE”:监听器执行期间或之后的延迟消息确认;在抛出异常的情况下潜在的重新传递。
  • “sessionTransacted”设置为“true”:成功监听执行后的事务确认;在抛出异常的情况下保证重新交付。

您可以使用最后一个选项,事务确认,以便在 onMessage() 方法未正常返回时重新传递消息。

于 2016-03-18T19:04:41.957 回答