2016-03-03 104 views
0

爲什麼在onMessage()偵聽器方法返回後,即使確認模式設置爲CLIENT_ACKNOWLEDGE,JMS消息也得到確認?爲什麼自動確認JMS消息

如果你看一下在AbstractMessageListenerContainer類的commitIfNecessary方法,你可以看到如下:

protected void commitIfNecessary(Session session, Message message) throws JMSException { 
    // Commit session or acknowledge message. 
    if (session.getTransacted()) { 
     // Commit necessary - but avoid commit call within a JTA transaction. 
     if (isSessionLocallyTransacted(session)) { 
      // Transacted session created by this container -> commit. 
      JmsUtils.commitIfNecessary(session); 
     } 
    } else if (message != null && isClientAcknowledge(session)) { 
     message.acknowledge(); 
    } 
} 

調試後,我確認message.acknowledge()被調用。

我認爲CLIENT_ACKNOWLEDGE意味着我需要手動確認消息?

有什麼想法?

謝謝,邁克爾

回答

1

在此背景下,該消息偵聽容器是客戶,而不是你的聽衆。

如果您希望手動確認(可能在收到大量消息後),請勿使用偵聽器容器;您可以使用JmsTemplate.execute()SessionCallback並創建自己的消費者。

+0

有意思,所以如果我想與偵聽器一起使用異步模型,唯一的選擇是在onMessage方法內拋出異常,以便消息不被確認? –

+0

我不確定你的意思;客戶確認是爲了推遲確認,但他們最終必須被確認;在確認之前,消息保持'未確認'狀態;如果連接丟失,它們將被重新排隊。拋出異常將導致郵件被刪除或重新發送,具體取決於您使用的是事務,確認模式和/或您正在使用的容器類型。使用SimpleMessageListenerContainer和AUTO時,消息將被重新排序;使用DefaultMessageListenerContainer和AUTO,消息將被刪除,除非會話被處理。 –

+0

我認爲CLIENT_ACK意味着消費者在成功處理後確認消息的責任。如果消費者不在onMessage方法內部回覆消息,則該消息不會被確認並因此被重新排序。 –