`

JMS可靠消息传送

阅读更多

可靠消息传送

可以将消息的传送模式 设置为持久性或非持久性;此模式控制消息传送的可靠性。

  • 保证只将持久性消息 传送并成功使用一次。在消息服务发生故障时,持久性消息不会丢失。对于这些消息,可靠性是优先考虑的因素。
  • 保证最多将非持久性消息 传送一次。在消息服务发生故障时,非持久性消息将会丢失。对于这些消息,可靠性并非主要的考虑因素。

对于持久性消息,确保可靠性有两个方面。一方面,通过使用确认和事务来确保成功生成和使用消息。另一方面,通过将消息放在持久性存储库中,确保在将持久性消息传送至消费者之前消息服务不会丢失持久性消息。

以下各节介绍这两个方面的可靠性保证措施。

确认/事务

可靠的消息传送取决于保证成功地将持久性消息从消息生产者传送到消息服务器上的物理目标,然后再成功地从该物理目标传送到消息消费者。这种可靠性可以通过 JMS 会话支持的两个通用机制实现:确认 事务 。事务可以是本地事务或分布式事务(由分布式事务管理器控制)。

确认

确认是在客户机与消息服务间发送的消息,用于确保可靠地进行传送。

生成消息时,消息服务确认它已收到传送的消息,将该消息置于其目标中并进行持久性存储。生产者的 send() 方法会阻塞,直至确认返回为止。

使用消息时,客户机确认已收到从某个目标传送来的消息并已使用,然后消息服务从该目标中删除消息。JMS 规定了不同的确认模式,它们分别代表不同的可靠性级别。在其中的某些模式下,客户机会阻塞,等待消息服务器确认已删除某个消息,并因此无法重新传送该消息。

本地事务

可以将会话配置为已处理 ,这样,可以将一个或多个消息的生成和/或使用组成原子单元,也就是事务 。JMS API 提供了启动、提交或回滚事务的方法。

在事务中生成或使用消息时,消息服务跟踪各个发送和接收过程,并在 JMS 客户机发出提交事务的调用时完成这些操作。如果事务中特定的发送或接收操作失败,则出现异常。客户机代码通过忽略异常、重试操作或回滚整个事务来处理异 常。在事务提交时,将完成其所有操作。在事务进行回滚时,将取消所有成功的操作。

本地事务的范围始终为一个会话。也就是说,可以将单个会话的上下文中执行的一个或多个生产者或消费者操作组成一个本地事务。

由于事务的范围只能为单个的会话,因此不存在既包括消息生成又包括消息使用的端对端事务。(换句话说,至目标的消息传送和随后进行的至客户机的消息传送不能放在同一个事务中。)

分布式事务

JMS 规范还支持分布式 事务。也就是 说,消息的生成和使用可作为较大的分布式事务的一部分,该分布式事务中包括涉及其他资源管理器(如数据库系统)的操作。在分布式事务中,分布式事务管理器 使用在 Java 事务 API (JTA)、XA 资源 API 规范中定义的两阶段提交协议跟踪和管理由多个资源管理器(如消息服务和数据库管理器)执行的操作。在 Java 中,JTA 规范说明了资源管理器和分布式事务管理器之间的交互。

支持分布式事务是指消息传送客户机可通过 JTA 定义的 XAResource 接口参与分布式事务。此接口定义了实现两阶段提交的许多方法。当客户机端进行 API 调用时,JMS 消息服务只与分布式事务管理器(由 Java 事务服务 (JTS) 提供)协作来跟踪分布式事务中的各种发送和接收操作、事务状态并完成消息传送操作。

处理本地事务时,客户机通过忽略异常、重试操作或回滚整个分布式事务来处理异常。

持久性存储器

另一方面的可靠性就是确保在将持久性消息传送至消费者之前,消息服务不会将它们丢失。这意味着,当持久性消息到达其物理目标时,消息服务器必须将其置于持久性数据存储库 中。如果消息服务器由于某种原因发生故障,它可以恢复此消息并将其传送至相应的消费者。

消息服务器还必须持久性地存储长期订阅。否则,当消息服务器发生故障时,就无法向长期订户传送消息;消息到达主题目标后,长期订户会恢复活动状态。

要保证成功传送消息,消息传送应用程序必须将消息指定为持久性消息,并将它们传送给具有长期订阅的主题目标或传送给队列目标。

分享到:
评论
1 楼 nanPrivate 2013-03-12  
有没有例子,只理论,实践起来还是不会啊

相关推荐

Global site tag (gtag.js) - Google Analytics