4.3.1 基本可靠性机制 4.3.1.1 控制消息的签收(Acknowledgment) 客户端成功接收一条消息的标志是这条消息被签收。成功接收一条消息一般包括如 下三个阶段: 1.客户端接收消息; 2.客户端处理消息; 3.消息被签收。签收可以由ActiveMQ 发起,也可以由客户端发起,取决于Sessi on 签收模式的设置。 在带事务的 Session 中,签收自动发生在事务提交时。如果事务回滚,所有已经接 收的消息将会被再次传送。 在不带事务的Session 中,一条消息何时和如何被签收取决于Session 的设置。 1.Session.AUTO_ACKNOWLEDGE 当客户端从 receive 或onMessage 成功返回时,Session 自动签收客户端的这 条消息的收条。在AUTO_ACKNOWLEDGE 的Session 中,同步接收receive 是上述三个阶 段的一个例外,在这种情况下,收条和签收紧随在处理消息之后发生。 2.Session.CLIENT_ACKNOWLEDGE 客户端通过调用消息的 acknowledge 方法签收消息。在这种情况下,签收发生。
收条。 3.Session.DUPS_OK_ACKNOWLEDGE 此选项指示 Session 不必确保对传送消息的签收。它可能引起消息的重复,但 是降低了Session 的开销,所以只有客户端能容忍重复的消息,才可使用(如果Activ eMQ 再次传送同一消息,那么消息头中的JMSRedelivered 将被设置为true)。
4.3.2.2
使用本地事务 签收模式分别为: 1. Session.AUTO_ACKNOWLEDGE 2. Session.CLIENT_ACKNOWLEDGE 3. Session.DUPS_OK_ACKNOWLEDGE ActiveMQConnection 方法: Session createSession(boolean transacted, int acknowledgeMode); 例如: Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); C++客户端: 签收模式分别为: 1. Session::AUTO_ACKNOWLEDGE 2. Session::CLIENT_ACKNOWLEDGE 3. Session:UPS_OK_ACKNOWLEDGE 4. Session::SESSION_TRANSACTED 函数原型: cms::Session* ActiveMQConnection::createSession( cms::Session::AcknowledgeMode ackMode ) throw ( cms::CMSException ) 例如: Session* session = connection->createSession( Session::AUTO_ACKNOWLEDGE ); 对队列来说,如果当一个Session 终止时它接收了消息但是没有签收,那么Activ eMQ 将保留这些消息并将再次传送给下一个进入队列的消费者。 对主题来说,如果持久订阅用户终止时,它已消费未签收的消息也将被保留,直到 再次传送给这个用户。对于非持久订阅,AtiveMQ 在用户Session 关闭时将删除这些消 息。 如果使用队列和持久订阅,并且Session 没有使用事务,那么可以使用Session 的 recover 方法停止Session,再次启动后将收到它第一条没有签收的消息,事实上,重 启后Session 一系列消息的传送都是以上一次最后一条已签收消息的下一条为起点。如 果这时有消息过期或者高优先级的消息到来,那么这时消息的传送将会和最初的有所不 同。对于非持久订阅用户,重启后,ActiveMQ 有可能删除所有没有签收的消息。 4.3.1.2 指定消息传送模式 ActiveMQ 支持两种消息传送模式:PERSISTENT 和NON_PERSISTENT 两种。 1.PERSISTENT(持久性消息) 这是 ActiveMQ 的默认传送模式,此模式保证这些消息只被传送一次和成 功使用一次。对于这些消息,可靠性是优先考虑的因素。可靠性的另一个重要方面是确 保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。这 意味着在持久性消息传送至目标时,消息服务将其放入持久性数据存储。如果消息服务 由于某种原因导致失败,它可以恢复此消息并将此消息传送至相应的消费者。虽然这样 增加了消息传送的开销,但却增加了可靠性。 2.NON_PERSISTENT(非持久性消息) 保证这些消息最多被传送一次。对于这些消息,可靠性并非主要的考虑因素。 此模式并不要求持久性的数据存储,也不保证消息服务由于某种原因导致失败后消息不 会丢失。
|
|