ActiveMQ的可靠性机制
-
缘由( 确认JMS消息)
只要消息被确认之后,才认为消息被成功消费了。消息的成功消费包括三个阶段:客户端接收消息、客户端处理消息以及客户端确认消息。在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值:
- Session.AUTO_ACKNOWDLEDGE
当消费者成功的从receive方法返回的时候,或者从MessageListener.onMessage监听方法成功返回的时候,会话自动确认消费者收到的消息。但是注意的是,这种方式消费者端不一定是向服务器端一条一条的确认消息。
代码:
// 通过Connection对象创建Session会话(上下文环境对象),
// 参数一,表示是否开启事务
// 参数二,表示的是签收模式,一般使用的有自动签收和客户端自己确认签收
Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
2.Session.CLIENT_ACKNOWLEDGE
客户通过消息的acknowledge方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确认。
代码:
// 使用Session来创建消息对象的生产者或者消费者
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
TextMessage textMessage = (TextMessage) createConsumer.receive();
if (textMessage == null)
break;
// 客户端的签收模式,
textMessage.acknowledge();
System.out.println("收到的内容为" + textMessage.getText());
}
3.Session.DUPS_OK_ACKNOWLEDGE
批量确认方式。消费者端会按照一定的策略向服务器端间隔发送一个ack标示,表示某一批消息已经处理完成。如果JMS Provider失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS Provider必须把消息头的JMSRedelivered字段设置为true。
代码: