介绍
Java 消息传递系统(JMS)提供企业内业务数据和事件异步通信的跨平台标准。该通信通常跨进程和机器。通常在不同机器上运行的应用程序中的对象通过使用借助 JMS 定义的一组标准接口来访问面向消息的中间件(MOM)的服务,从而进行通信。
JMS 提供了一组接口,将 Java 程序员(实现消息生产者和使用者)与 MOM 供应者隔离。
该内容页描述 JMS 的关键概念和典型使用。
消息
消息是一个自包含的业务数据包。它有三个区间:
-
头(Header):包含网络路由信息和消息标识。
-
属性(Properties):包含消息的元数据。JMS 规定了一些属性,但应用程序员也可以添加他们自己的属性。
-
有效负载(Payload):包含实际的业务数据。有效负载完全由应用程序员控制。
在 JMS 中,消息封装在一个对象中,该对象实现了 javax.jms.Message 接口。Java 程序可以在这整个接口中访问这些区间,如下图中所示。有效负载有几种变体,在稍后讨论。
头包含始终必须存在的消息属性。头中提供了以下属性:
-
消息标识(MessageID)
-
时间戳记(Timestamp)
-
相关标识(CorrelationID)
-
回复至(ReplyTo)
-
目的地(Destination)
-
交付方式(DeliveryMode)
-
已重新交付(Redelivered)
-
类型
-
到期(Expiration)
-
优先级
应用程序员可以使用这些属性提供消息的元数据。各属性由任意的一组“名称-值”对组成。
JMS 支持六种类型的有效负载:
-
文本消息
-
对象消息
-
字节消息
-
映射消息
-
流消息
-
消息(无正文)
在类层次结构中反映有效负载的类型,其中接口扩展 javax.jms.Message。在以下类图中,显示了经常使用的文本、对象和字节消息。文本消息通常作为 XML 数据的载体。
目的地
JMS 定义了目的地的概念。将消息发送至目的地,并从目的地接收消息。目的地有两种形式:
队列是当仅有一个接收器处理消息时使用的消息目的地。 想象消息与发送缓慢的邮件类似,队列则是特定收件人所拥有的邮箱。 使用队列的通信称为点到点通信。
主题是当有多个收件人需要接收消息时使用的消息目的地,每个收件人表示愿意接收特定类型的消息。再次使用模拟缓慢邮件的方法,可以将此情况想象成在报纸中写一篇文章,一条消息可以被任意数量的收件人阅读。我们经常将此种类型的设计称为
发布-预订模型。
消息传递
可以用两种方法执行消息传递:
持久传递包括将消息存储到文件或数据库中,以保证传递。 非持久传递提高了性能并减少了存储开销,但不保证该消息被传递。对于大多数使用 JMS 的应用程序,通常选择持久传递方法。
JMS 客户端
JMS 客户端是使用 JMS 的 Java 对象。定义了两种角色:
-
消息生产者:创建和发送消息的 Java 程序。
-
消息使用者:接收消息的 Java 程序。
下图是生产者、使用者和 JMS 供应者如何协作的概述。
消息生产者可以是有权访问 JMS 实施的任何 Java 类。消息生产者创建和发送消息。
消息使用者可以是有权访问 JMS 实施的任何 Java 类。消息使用者接收和处理消息。
JMS 客户端使用一组接口访问 JMS。通过一组工厂创建实现 JMS 接口的对象。初始工厂是 ConnectionFactory。通过 JNDI 查找连接工厂。JMS
客户端使用连接工厂来创建连接对象。连接对象用于创建会话对象,会话对象用作其他 JMS 对象的工厂。下图说明了从队列和主题的详细信息中抽象出来的工厂之间的关键概念关系。
连接工厂、连接和会话有两种形式:一种用于队列,而另一种用于主题。以下类图显示关键 JMS 概念的接口层次结构。
JMS 供应者
JMS 供应者是满足 JMS 规范的一种实施。JMS 供应者负责接收、保存和传递消息。
更多信息
关于 JMS 的更多信息,请访问 http://java.sun.com/products/jms/。
|