消息的签收(Acknowledgment):
客户端成功接收一条消息的标志是这条消息被签收。
成功接收一条消息一般包括如下三个阶段:
(1) 客户端接收消息
(2) 客户端处理消息
(3) 消息被签收
签收可以由ActiveMQ发起,也可以由客户端发起,取决于Session签收模式的设置。
在带事务的Session中,签收自动发生在事务提交时。如果事务回滚,所有已经接收的消息将会被再次传送。在不带事务的Session中,一条消息何时和如何被签收取决于Session的设置。
非事务会话可做如下设置:
1.Session.AUTO_ACKNOWLEDGE(自动确认模式)
当消息成功的从receive方法返回时,或者从MessageListener接口的onMessage方法成功返回时,会话自动确认客户端的消息接收。
2.Session.CLIENT_ACKNOWLEDGE(客户端确认模式)
客户端通过调用消息的acknowledge方法签收消息。在这种模式中,签收是在会话层上进行:签收一个已消费的消息会自动地签收这个Session所有已消费消息的收条。
例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都会被确认。
3. Session.DUPS_OK_ACKNOWLEDGE(延时/批量确认模式)
这种确认方式允许JMS不必急于确认收到的消息,允许在收到多个消息之后一次完成确认,与Auto_AcKnowledge相比,这种确认方式在某些情况下可能更有效,因为没有确认,当系统崩溃或者网络出现故障的时候,消息可以被重新传递.
这种方式会引起消息的重复,但是降低了Session的开销,所以只有客户端能容忍重复的消息,才可使用。(如果ActiveMQ再次传送同一消息,那么消息头中的JMSRedelivered将被设置为true)