我知道这篇文章已经过时了,但这个答案应该会让那些后来偶然发现它的人受益。
如果您想精细控制要确认的消息,individual
确认方法应该对你有帮助。使用此确认模式,您可以确认会话中的各个消息。尚未被确认的消息将被重新传送。
这不是规范的一部分,但大多数队列提供程序都在规范之外支持它。
Oracle http://docs.oracle.com/cd/E19717-01/819-7757/aeqeg/index.html
为了获得更大的灵活性,消息队列允许您自定义 JMS
客户端确认模式。在客户端确认模式下,客户端
通过调用显式确认消息消耗
消息对象的acknowledge()方法。
标准行为
该方法用于使会话确认所有消息
自上次以来已被会话中的任何消费者消费
该方法被调用。 (也就是说,会话确认当前
消息和所有先前未确认的消息,无论是谁
消耗了他们。)
除了 JMS 指定的标准行为之外,消息队列
允许您使用客户端确认模式来确认一条消息
时间。
public interface com.sun.messaging.jms.Message {
void acknowledgeThisMessage() throws JMSException;
void acknowledgeUpThroughThisMessage() throws JMSException;
}
ActiveMQ https://java.net/jira/browse/JMS_SPEC-95
人们可以想象其他也有用的确认模式,例如
示例: CONSUMER_ACKNOWLEDGE 其中 Message.acknowledge() 将
仅确认特定 MessageConsumer 上收到的消息,
或 CONSUMER_CHECKPOINT_ACKNOWLEDGE 其中 Message.acknowledge() 会
仅确认收到的消息(包括该消息)
调用该方法的实例。
但如果不尝试所有这些不同的可能性,
是否可以考虑只添加 INDIVIDUAL_ACKNOWLEDGE
模式?仅此一点就可以实现多线程应用程序
实现他们需要的任何行为。
connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
我个人没有使用过 QPID,但是文档提示 http://qpid.apache.org/releases/qpid-0.22/messaging-api/ruby/api/classes/Qpid/Messaging/Session.html#M000009事实上,单独的消息确认是可能的。
Examples
# acknowledge all received messages
session.acknowledge
# acknowledge a single message
session.acknowledge :message => message
在处理批次时,您可以确认接收和处理的每条消息。如果遇到异常,不要ack消息。