我知道這篇文章已經過時了,但這個答案應該會讓那些稍後偶然發現的人受益。
如果您想要細緻地控制您要確認哪些郵件,individual
確認方法應該會對您有所幫助。使用此確認模式,您可以在會話中查看單個消息。未被確認的消息將被重新發送。
這不是規範的一部分,但大多數隊列提供程序在規範之外支持它。
更多的靈活性,消息隊列可以自定義JMS 客戶確認模式。在客戶端確認模式下,客戶端 通過調用消息對象的確認()方法明確確認消息消耗。
的 標準的行爲,這種方法是導致會話承認 已經由出席會議的所有消費者自上次 調用方法消耗的所有消息。 (也就是說,會議承認當前 消息,所有以前未確認的消息,不管是誰 消耗他們。)
除了通過JMS規定的標準的行爲,消息隊列 ,您可以使用客戶確認模式在 時間確認一條消息。
public interface com.sun.messaging.jms.Message {
void acknowledgeThisMessage() throws JMSException;
void acknowledgeUpThroughThisMessage() throws JMSException;
}
ActiveMQ
可以想見其它確認模式,這將是有用的也爲 例如:CONSUMER_ACKNOWLEDGE其中Message.acknowledge()將 僅確認消息中接收了關於特定的MessageConsumer , 或CONSUMER_CHECKPOINT_ACKNOWLEDGE其中Message.acknowledge()將 只確認收到的消息,直到幷包括消息 實例該方法被調用。
但是,如果不着手所有這些不同的可能性, 有可能考慮只添加INDIVIDUAL_ACKNOWLEDGE 模式?僅此一項,就可以讓多線程應用程序實現他們所需的任何行爲。
connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
我沒有用過QPID個人,但是documentation hints的事實,個人信息的ACK是可能的。
Examples
# acknowledge all received messages
session.acknowledge
# acknowledge a single message
session.acknowledge :message => message
在處理批處理時,您可以確認每個接收和處理的消息。如果遇到異常情況,請不要回復消息。
您還沒有指定您正在使用的郵件提供程序。但據我所知,許多消息提供商不允許隨機的消息確認。如果您確認收到一條消息,則直到此時收到的所有消息也會被確認並從隊列中移除 – Shashi
我使用apache qpid,並且我沒有做隨機確認,而是對特定消息做出確認。如果之前的所有消息都被清除,那麼確定,但是如果接收到更多消息,它們也會被刪除。 – Raks