我知道这篇文章已经过时了,但这个答案应该会让那些稍后偶然发现的人受益。
如果您想要细致地控制您要确认哪些邮件,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