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
意味着我需要手動確認消息?
有什麼想法?
謝謝,邁克爾
有意思,所以如果我想與偵聽器一起使用異步模型,唯一的選擇是在onMessage方法內拋出異常,以便消息不被確認? –
我不確定你的意思;客戶確認是爲了推遲確認,但他們最終必須被確認;在確認之前,消息保持'未確認'狀態;如果連接丟失,它們將被重新排隊。拋出異常將導致郵件被刪除或重新發送,具體取決於您使用的是事務,確認模式和/或您正在使用的容器類型。使用SimpleMessageListenerContainer和AUTO時,消息將被重新排序;使用DefaultMessageListenerContainer和AUTO,消息將被刪除,除非會話被處理。 –
我認爲CLIENT_ACK意味着消費者在成功處理後確認消息的責任。如果消費者不在onMessage方法內部回覆消息,則該消息不會被確認並因此被重新排序。 –