Session Solace会话恢复、消息重新传递

Session Solace会话恢复、消息重新传递,session,solace,Session,Solace,我使用SpringDefaultMessageListenerContainer和JMS消息侦听器来使用Solace队列中的消息。客户端确认设置为true 在异常情况下,由于消息未被确认且未重新传递,因此将保留在队列中。将处理在异常后泵送的新消息 已经阅读了有关使用session.recover的内容,但是我们如何处理会话呢。还尝试将maxredelivery设置为3。但不起作用 public void onMessage(Message message) { String text = nu

我使用SpringDefaultMessageListenerContainer和JMS消息侦听器来使用Solace队列中的消息。客户端确认设置为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);
 }
} 
public-void-onMessage(消息消息){
字符串文本=空;
trace(CLAZZ_名称,“onMessage()”,“Message Received:”);
试一试{
text消息text消息=(text消息)消息;
text=textMessage.getText();
trace(CLAZZ_名称,“onMessage()”,“Message Received:”+text);
Document xmlDocument=parseXml(文本);
Mapvalues=getValues(xmlDocument);
保存值(值);
message.acknowledge();
}捕获(例外情况除外){
ALNTLogger.error(CLAZZ_NAME,“onMessage()”,“无法处理消息:“+text”);
抛出新的运行时异常(ex);
}
} 

任何帮助都将不胜感激

当使用带有DefaultMessageListenerContainer的客户端确认确认模式时,预期不会重新发送消息

Spring文档说明了以下内容:

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

  • “sessionAcknowledgeMode”设置为“自动确认”(默认值): 侦听器执行前的自动消息确认;不 在引发异常的情况下重新交付
  • “会话确认模式”集合 至“客户端确认”:在 监听器执行成功;例外情况下,不得重新交付 扔
  • “sessionAcknowledgeMode”设置为“DUPS_OK_ACKNOWLEDGE”:懒惰 侦听器执行期间或之后的消息确认;潜在的 在引发异常的情况下重新交付
  • “sessionTransacted”设置为 “true”:侦听器成功后的事务确认 执行;在引发异常的情况下保证重新交付

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

因此,这意味着在使用
MessageListenerContainer
时,唯一有用的会话模式是事务性的,除非应用程序有时不关心消息丢失。更糟糕的是,默认情况下(
AUTO_ACKNOWLEDGE
),如果出现异常,消息将丢失。。。我想知道有多少应用程序是在不知情的情况下这样做的。
AbstractMessageListenerContainer
JavaDocs从那时起就得到了改进,因此例如对于
CLIENT\u ACKNOWLEDGE
,它说“在引发用户异常的情况下尽最大努力重新交付”。为什么这只是一个最好的努力。。。