你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Java 消息服务 (JMS) 2.0 实体

连接到 Azure 服务总线高级版并使用 Azure 服务总线 JMS 库 的客户端应用程序可以使用以下实体。

Queues

JMS 中的队列在语义上与传统的 服务总线队列相当。

若要创建队列,请在类中使用 JMSContext 以下方法 -

Queue createQueue(String queueName)

主题

JMS 中的主题在语义上与传统的 服务总线主题相当。

若要创建主题,请使用类中的 JMSContext 以下方法 -

Topic createTopic(String topicName)

临时队列

如果客户端应用程序需要应用程序生存期内存在的临时实体,则可以使用临时队列。 这些实体用于 请求-回复 模式。

若要创建临时队列,请使用类中的 JMSContext 以下方法 -

TemporaryQueue createTemporaryQueue()

临时主题

与临时队列一样,临时主题的存在使得可以通过在应用程序生命周期内存在的临时实体实现发布/订阅。

若要创建临时主题,请使用类中的 JMSContext 以下方法 -

TemporaryTopic createTemporaryTopic()

Java 消息服务 (JMS) 订阅

虽然这些订阅在语义上类似于 服务总线主题上的订阅(即存在于一个主题上并启用发布/订阅语义),但 Java 消息服务规范为给定的订阅引入了 共享未共享、持久和非持久属性的概念。

注释

Azure 服务总线高级层中以下订阅可用于通过 Azure 服务总线 JMS 库连接至 Azure 服务总线的客户端应用程序。

只能使用 Azure 门户创建持久订阅。

共享持久订阅

当应用程序接收和处理在某个主题上发布的所有消息时,无论应用程序是否始终在积极地使用该订阅,都将使用共享持久订阅。

通过身份验证后可以从服务总线接收消息的任何应用程序都可以从共享持久订阅中接收消息。

若要创建共享持久订阅,请在类上使用 JMSContext 以下方法 -

JMSConsumer createSharedDurableConsumer(Topic topic, String name)

JMSConsumer createSharedDurableConsumer(Topic topic, String name, String messageSelector)

除非使用 unsubscribe 类上的 JMSContext 方法删除,否则共享持久订阅将继续存在。

void unsubscribe(String name)

非共享持久订阅

与共享持久订阅一样,当主题上发布的所有消息需要被应用程序接收和处理时,将使用未共享持久订阅,而不考虑应用程序是否正在主动从订阅中消费。

但是,由于此订阅是一个未共享的订阅,因此只有创建订阅的应用程序才能从它接收。

若要创建未共享的持久订阅,请使用类中的以下方法 JMSContext -

JMSConsumer createDurableConsumer(Topic topic, String name)

JMSConsumer createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

注释

此功能 noLocal 当前不受支持并被忽略。

除非使用 unsubscribe 类上 JMSContext 的方法删除,否则未共享持久订阅将继续存在。

void unsubscribe(String name)

共享非持久的订阅

当多个客户端应用程序需要从单个订阅接收和处理消息时,会使用共享非持久的订阅,该订阅仅在客户端主动消费或接收消息时有效。

由于不是持久订阅,因此不会持久化。 当订阅上没有活动使用者时,此订阅不会收到消息。

若要创建共享非持久订阅,请根据JMSContext类中的以下方法创建一个JmsConsumer订阅,如下所示 -

JMSConsumer createSharedConsumer(Topic topic, String sharedSubscriptionName)

JMSConsumer createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)

共享非持久性订阅将继续存在,直到有活跃消费者从中接收。

不可共享的非持久性订阅

当客户端应用程序需要接收和处理来自订阅的消息时,使用非共享非持久订阅,直到它主动从订阅中使用为止。 此订阅上只能存在一个使用者,即创建订阅的客户端。

由于不是持久订阅,因此不会持久化。 当订阅上没有活动使用者时,此订阅不会收到消息。

若要创建不共享的非持久性订阅,请根据JMSConsumer类中的以下方法创建一个JMSContext订阅,如下所示 -

JMSConsumer createConsumer(Destination destination)

JMSConsumer createConsumer(Destination destination, String messageSelector)

JMSConsumer createConsumer(Destination destination, String messageSelector, boolean noLocal)

注释

此功能 noLocal 当前不受支持并被忽略。

非共享非持久订阅将继续存在,直到有活跃的使用者从中收到订阅为止。

消息选择器

就像常规服务总线订阅存在 筛选器和操作 一样,JMS 订阅也存在 消息选择器

可以在每个 JMS 订阅上设置消息选择器,并作为消息标头属性的筛选器条件存在。 仅传递与消息选择器表达式匹配的标头属性的消息。 null 或空字符串的值指示 JMS 订阅/使用者没有消息选择器。

Java 消息服务 (JMS) 2.0 订阅的其他概念

客户范围定义

正如在 Java 消息服务 (JMS) 2.0 API 中指定的,订阅可能是也可能不是范围为特定的客户端应用程序(用适当的 clientId 标识)。

限定订阅范围后,只能从具有相同客户端 ID 的客户端应用程序 访问 该订阅。

尝试访问范围为特定客户端 ID(例如 clientId1)的订阅时,从具有另一个客户端 ID(例如 clientId2)的应用程序进行的任何尝试都会导致创建范围为另一个客户端 ID (clientId2) 的另一个订阅。

注释

客户端 ID 可以为 null 或为空,但它必须与 JMS 客户端应用程序上设置的客户端 ID 匹配。 从 Azure 服务总线的角度来看,空客户端 ID 和空白客户端 ID 具有相同的行为。

如果客户端 ID 设置为 null 或为空,则客户端 ID 也设置为 null 或为空的客户端应用程序才可访问。

可共享性

共享 订阅允许多个客户端/使用者(即 JMSConsumer 对象)从它们接收消息。

注释

多个客户端/使用者(即 JMSConsumer 对象)仍可访问限定为特定客户端 ID 的共享订阅,但每个客户端应用程序必须具有相同的客户端 ID。

未共享 订阅仅允许单个客户端/使用者(即 JMSConsumer 对象)从它们接收消息。 如果在非共享订阅上创建了一个 JMSConsumer,同时它已有一个活跃的 JMSConsumer 在侦听其消息,则会抛出 JMSException

Durability

持久订阅具有持久性,并持续从主题中收集消息,而不考虑应用程序 (JMSConsumer) 是否在使用来自该主题的消息。

非持久订阅不具有持久性,只有应用程序 (JMSConsumer) 在使用来自主题的消息时才会从该主题收集消息。

客户端范围内订阅的表示形式

鉴于客户端作用域 (JMS) 订阅必须与现有 订阅共存,则表示客户端作用域 (JMS) 订阅的方式使用以下格式。

  • <SUBSCRIPTION-NAME>$<CLIENT-ID>$D (适用于持久订阅)
  • <SUBSCRIPTION-NAME>$<CLIENT-ID>$ND(对于非持久订阅)

$是分隔符。

后续步骤

有关使用服务总线消息传送的详细信息和示例,请参阅以下高级主题: