Sun Java System Message Queue 3.7 UR1 技术概述

消息传送域

消息传送中间件使各组件和应用程序可通过生成并使用消息来进行通信。JMS API 定义管理该通信的两种模式或消息传送域点对点消息传送发布/订阅消息传送。JMS API 的组织可支持这些模式。基本 JMS 对象包括:用于指定两个域中的消息传送行为的连接、会话、生成方、使用方、目的地和消息。

点对点消息传送

在点对点域中,消息生成方被称为发送者,而使用方被称为接收者。它们通过被称为队列的目的地来交换消息:发送者生成队列中的消息;而接收者则使用队列中的消息。

图 2–1 显示了点对点域中最简单的消息传送操作。MyQueueSender 向队列目的地 MyQueue1 发送 Msg1。然后, MyQueueReceiverMyQueue1 获得该消息。

图 2–1 简单点对点消息传送

消息通过队列目的地从发送者传输给接收者。该图用文本进行说明。

图 2–2 显示了一个更为复杂的点对点消息传送图,以说明该域中的可能情况。两个发送者 MyQSender1MyQSender2 使用同一连接向 MyQueue1 发送消息。 MyQSender3 使用另一连接向 MyQueue1 发送消息。在接收端,MyQReceiver1 独占一个连接使用 MyQueue1 中的消息,而 MyQReceiver2MyQReceiver3 共享一个连接以使用 MyQueue1 中的消息。

图 2–2 复杂点对点消息传送

两个发送者使用一个连接向一个接收者发送消息。两个使用方从同一队列获得消息。该图采用文本进行说明。

这个较为复杂的图说明了有关点对点消息传送的其他几点。

点对点模型具有许多优势:

发布/订阅消息传送

在发布/订阅域中,消息生成方被称为发布者,而消息使用方则被称为订户。它们通过称为主题的目的地来交换消息:发布者生成主题中的消息;订户则订阅主题并使用主题中的消息。

图 2–3 显示了发布/订阅域中的简单消息传送操作。MyTopicPublisher 向目的地 MyTopic 发布 Msg1。然后,MyTopicSubscriber1MyTopicSubscriber2 均从 MyTopic 接收 Msg1 的副本。

图 2–3 简单发布/订阅消息传送

图中显示了通过一个主题目的地向两个订户发送同一条消息的一个发布者。该图用文本进行说明。

虽然发布/订阅模型不要求多个订户,但图中仍显示了两个订户来强调通过此域可以广播消息。一个主题的所有订户均可获得发布到该主题的任何消息的副本。

长期订户可能处于活动状态,也可能处于非活动状态。代理会为所有活动订户保留消息,但对于非活动订户,则只为那些长期订户保留消息。

图 2–4 显示了更为复杂的发布/订阅消息传送图,以说明该模式提供的可能情况。多个生成方向 Topic1 目的地发布消息。多个订户使用来自 Topic1 目的地的消息。除非订户使用选择器来过滤消息,否则每个订户均可获得发布到所选主题的所有消息。在图 2–4 中,MyTSubscriber2 已过滤掉 Msg2

图 2–4 复杂发布/订阅消息传送

图中显示了通过一个主题目的地向三个订户发送消息的三个发布者。该图用文本进行说明。

这张较为复杂的图说明了有关发布/订阅消息传送的很多其他点。

发布/订阅模型的最大优点是消息可以广播给订户。

特定于域的 API 及统一域 API

JMS API 定义可用于实现点对点域或发布/订阅域的接口和类。这些是表 2–1 的第 2 列和第 3 列中显示的特定于域的 API。JMS API 还定义另外一个统一域,用于通过编程实现常规的消息传送客户端。这类客户端的行为由目的地类型决定,客户端向目的地中生成消息并使用目的地中的消息。如果该目的地是一个队列,则消息传送行为将为点对点模式;如果该目的地是一个主题,则消息传送行为将为发布/订阅模式。

表 2–1 JMS 编程域和对象

基本类型(统一域) 

点对点域 

发布/订阅域 

Destination(队列或主题)

Queue

Topic

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver

TopicSubscriber

统一域通过 JMS 版本 1.1 引入。 如果需要遵守早期的 1.02b 规范,则可以使用特定于域的 API。使用特定于域的 API 还能够提供全新编程接口,可以防止出现某些类型的编程错误:例如,为队列目的地创建长期订户。但是,特定于域的 API 的缺点是,不能在同一事务或同一会话中将点对点和发布/订阅操作相结合。如果需要执行该操作,则应选择统一域 API。有关将两种域相结合的示例,请参见请求-回复模式