2016-03-18 2 views
2

Я использую Spring DefaultMessageListenerContainer и JMS Message Listener для использования сообщений из Solace Queue. Подтверждение клиента установлено на true.Solace Session Recovery, сообщение redelivery

В случае сообщений об исключении остаются в очереди, так как они не были подтверждены, и они не были повторно отправлены. Обработаны новые сообщения, которые были отправлены после исключения.

Прочитали об использовании 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); 
} 
} 

Любая помощь будет оценена

ответ

2

Ожидается, что сообщение не повторно доставлена ​​при использовании режима подтверждения CLIENT_ACKNOWLEDGE с DefaultMessageListenerContainer.

Документации Spring гласит следующее:

Контейнер слушателя предлагает следующие подтверждения сообщения опции:

  • "sessionAcknowledgeMode" на "AUTO_ACKNOWLEDGE" (по умолчанию): Автоматического подтверждение сообщений перед выполнением слушателя; no redelivery в случае исключения брошенный.
  • «sessionAcknowledgeMode» установить в «CLIENT_ACKNOWLEDGE»: автоматическое подтверждение сообщения после успешное выполнение слушателя; нет redelivery в случае исключения брошен.
  • «sessionAcknowledgeMode» установлен на «DUPS_OK_ACKNOWLEDGE»: Lazy подтверждение сообщения во время или после исполнения слушателя; потенциал redelivery в случае исключения брошенный.
  • «sessionTransacted» установлен на «true»: подтверждение транзакции после успешного прослушивателя исполнение; гарантированная доставка в случае исключения.

Вы можете использовать последний вариант, транзакционные подтверждения, для того, чтобы иметь сообщение, когда повторно доставлен метод OnMessage() не возвращает нормально.

+0

Таким образом, это означает, что при использовании «MessageListenerContainer» единственный полезный сеансовый режим является транзакционным, если приложение не заботится о потере сообщений иногда. Хуже того, это по умолчанию ('AUTO_ACKNOWLEDGE'), что сообщения просто теряются, если у вас есть исключение ... Интересно, сколько приложений там делает это, не зная. – ddekany

+0

С тех пор были улучшены JavaDocs «AbstractMessageListenerContainer», поэтому, например, для 'CLIENT_ACKNOWLEDGE' он говорит« перепродажа с наилучшими усилиями в случае вызванного исключения пользователя ». Почему это просто лучшее усилие, хотя ... – ddekany

Смежные вопросы