我知道这篇文章很旧,但是这个答案应该对以后偶然发现它的人有所帮助。
如果您想对要确认的消息进行细粒度控制,则individual
确认方法应该可以帮助您。使用此确认模式,您可以确认会话中的单个消息。尚未确认的消息将被重新传递。
这不是规范的一部分,但大多数队列提供程序在规范之外支持它。
为了获得更大的灵活性,Message Queue 允许您自定义 JMS 客户端确认模式。在客户端确认模式下,客户端通过调用消息对象的确认()方法显式确认消息消费。
此方法的标准行为是使会话确认自上次调用该方法以来会话中任何消费者已消费的所有消息。(也就是说,会话确认当前消息和所有以前未确认的消息,而不管是谁消费了它们。)
除了 JMS 指定的标准行为之外,Message Queue 还允许您使用客户端确认模式一次确认一条消息。
public interface com.sun.messaging.jms.Message {
void acknowledgeThisMessage() throws JMSException;
void acknowledgeUpThroughThisMessage() throws JMSException;
}
可以想象其他也有用的确认模式,例如: CONSUMER_ACKNOWLEDGE,其中 Message.acknowledge() 将仅确认在特定 MessageConsumer 上收到的消息,或 CONSUMER_CHECKPOINT_ACKNOWLEDGE,其中 Message.acknowledge() 将仅确认收到的消息,包括调用该方法的 Message 实例。
但是如果不考虑所有这些不同的可能性,是否可以考虑只添加 INDIVIDUAL_ACKNOWLEDGE 模式?仅这一点就可以让多线程应用程序实现他们需要的任何行为。
connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
我个人没有使用过 QPID,但是文档暗示了单个消息确认是可能的这一事实。
Examples
# acknowledge all received messages
session.acknowledge
# acknowledge a single message
session.acknowledge :message => message
在处理批处理时,您可以确认接收和处理的每条消息。如果遇到异常,请不要确认消息。