2016-03-18 93 views
2

我使用Spring DefaultMessageListenerContainer和JMS Message Listener來使用來自Solace隊列的消息。客戶確認設置爲true。Solace會話恢復,消息傳遞

如果異常消息保留在隊列中,因爲它們沒有被確認,並且這些消息沒有被重新發送。處理異常後抽取的新消息。

已閱讀使用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」(默認): 自動消息確認在聽衆執行之前;沒有 在發生異常情況下重新發送。
  • 「sessionAcknowledgeMode」將 設置爲「CLIENT_ACKNOWLEDGE」: 成功偵聽器執行後自動確認消息;拋出異常 的情況下無再次遞送。
  • 「sessionAcknowledgeMode」設置爲「DUPS_OK_ACKNOWLEDGE」:懶惰 在偵聽器執行期間或之後的消息確認;潛在的 在發生異常情況下重新發送。
  • 「sessionTransacted」設置爲 「true」:成功偵聽器執行後的事務性確認 執行;保證在發生異常情況下的重新投遞。

可以使用最後一個選項,交易確認,纔能有當onMessage()方法通常不返回重新傳遞消息。

+0

所以這意味着當使用'MessageListenerContainer'時,唯一有用的會話模式是事務性的,除非應用程序有時不關心丟失消息。更糟的是,它是默認的('AUTO_ACKNOWLEDGE'),如果你有一個異常,那麼這些消息就會丟失......我不知道有多少應用程序在那裏執行。 – ddekany

+0

從那以後,'AbstractMessageListenerContainer' JavaDocs得到了改進,所以例如對於'CLIENT_ACKNOWLEDGE',它說「在引發用戶異常的情況下盡最大努力重新傳遞」。爲什麼這只是盡力而爲... – ddekany