5.1 概述

点对点系统是与消息队列一起工作的。它们是点对点的是因为客户端将消息发送到一个队列。某些PTP 系统通过给客户端提供自动分发消息功能模糊了PTP和Pub/Sub间的差别。

对客户端来讲,通常是将它们的消息转发到单个队列中。

和常见的邮件箱一样,队列可以包含混合消息。但类似于实际的邮件箱,创建和维护每个队列的成本都是很高的。大多数队列都由管理员创建,并被客户端看作是静态资源。

JMS PTP模型定义了客户端如何和队列工作;如何找到队列,客户端如何将消息发送给它们,以及如何从队列中接收消息。

本章描述了PTP模型的语义。支持PTP模型的JMS提供商必须实现这里描述的语义。

不管JMS客户端程序是否使用PTP域的接口,还是在第4章“JMS公共工具”中描述的公共接口,客户端程序必须被保证有相同的行为。

表5‐1展示了PTP域特有的接口和JMS的公共接口。公共接口是创建JMS应用程序的最佳方式,因为它们是独立于域的。

表 5.1. PTP域接口和JMS公共接口

PTP域接口JMS最佳的公共接口
QueueConnectionFactory ConnectionFactory
QueueConnection Connection
Queue Destination
QueueSession Session
QueueSender MessageProducer
QueueReceiver MessageConsumer

5.2 队列管理

JMS没有定义创建、管理或删除长生命队列的工具(没有为TemporaryQueue提供这样的机制)。由于大多数客户的使用静态定义的队列,因此这不是问题。

5.3 Queue

Queue对象封装了提供商特有的队列名称。这个名称是客户端为JMS方法指定队列标识的途径。

JMS没有定义消息被队列持有的真正时间长度和资源溢出的后果。

参见节4.2“受管理的对象”了解关于JMS Destination对象的更多信息。

5.4 TemporaryQueue

TemporaryQueue是唯一的Queue对象,它为Connection或QueueConnection 的永久性而创建。它是系统定义的队列,只能被创建它的Connection或QueueConnection来消费。

参见节4.4.3“创建临时目的地”了解更详细的信息。

5.5 QueueConnectionFactory

客户端使用QueueConnectionFactory来创建具有JMS PT 提供商的QueueConnection。

参见节4.2“受管理对象”了解关于JMS QueueConnectionFactory对象更多的信息。

5.6 QueueConnection

QueueConnection是一个对JMS PTP 提供商的活动连接。客户端使用QueueConnection来创建一到多个用于生产和消费消息的QueueSession。

参见节4.3“Connection”了解更详细的信息。

5.7 QueueSession

QueueSession 提供了创建QueueReceiver、QueueSender、QueueBrowser和TemporaryQueue 的方法。

如果在QueueSession 终止时还有已被接收但还没被确认的消息,那么这些消息必须被保留,且在消费者下一次访问队列时被重发。

参见节4.4“Session”了解更详细的信息。

5.8 QueueReceiver

客户端使用QueueReceiver来接收已被转发到队列的消息。

尽管里两个会话可以有连接到同一个队列的QueueReceiver,但JMS没有定义在QueueReceiver间如何分发消息。

如果QueueReceiver 指定了消息选择器,那么没被选中的消息仍然在队列中。根据定义,消息选择器可以让QueueReceiver跳过消息。这意味着当跳过的消息最终被读时,总的读排序不保留由每个消息生产者定义的部分排序。只有没有消息选择器的QueueReceiver才按照消息生产者指定的顺序读消息。

参见4.5“MessageConsumer”了解更详细的信息。如果MessageConsumer 正在从Queue中消费消息,那么它的行为必须和节5.8“QueueReceiver”中描述的一样。

客户端使用MessageProducer或QueueSender来向Queue发送消息。

参见节4.6“MessageProducer”了解更详细的信息。

5.9 QueueBrowser

客户端使用QueueBrowser来查看队列中的消息,但不删除它们。QueueBrowser可以从Session或QueueSession 来创建。

浏览方法返回java.util.Enumeration,它用于遍历队列中的消息。它可以是队列的全部内容,或它只包含批评消息选择器的消息。

当在浏览消息时,消息可以到达和到期。JMS不要求枚举的内容是对列内容的静态快照。这些变化是否可见依赖于JMS 提供商。

5.10 QueueRequestor

JMS提供了一个QueueRequestor帮助类来简化服务请求。

QueueRequestor构造器需要一个QueueSession和目的地队列。它为响应创建TemporaryQueue,并提供了一个request方法来发送请求信息和等待回复。

5.11 可靠性

队列通常由管理员创建,并长时间存在。它总是持有发送到它的消息,不管消费消息的客户端是否是活动的。因此,客户端不必担心它会错过消息。