【问题标题】:Solace Session Recovery , message redelivery安慰会话恢复,消息重新传递
【发布时间】:2016-07-05 00:49:53
【问题描述】:

我正在使用 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);
 }
} 

任何帮助将不胜感激

【问题讨论】:

    标签: session solace


    【解决方案1】:

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

    Spring 文档声明如下:

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

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

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

    【讨论】:

    • 所以这意味着当使用MessageListenerContainer 时,唯一有用的会话模式是事务性的,除非应用程序有时不关心丢失消息。更糟糕的是,默认情况下 (AUTO_ACKNOWLEDGE) 如果出现异常,消息就会丢失......我想知道有多少应用程序在不知道的情况下这样做。
    • 从那时起,AbstractMessageListenerContainer JavaDocs 得到了改进,例如对于CLIENT_ACKNOWLEDGE,它表示“在抛出用户异常的情况下尽最大努力重新交付”。为什么这只是尽力而为......
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多