跳到主要内容

在PubSub+ JCSMP API中管理订阅

使用 PubSub+ JCSMP API 的客户端必须使用主题订阅来接收直接消息。订阅代表客户端在发布/订阅消息传递域中表达其感兴趣消息的意图。

主题代表一个逻辑目的地。客户端可以向主题目的地发布消息。客户端也可以订阅主题,当事件代理有与消息目的地匹配的主题订阅时,客户端可以接收消息。

主题可以分层组织。因此,支持通配符的主题订阅可以为客户端吸引层次结构的一部分,而无需订阅每个可能的层次级别组合。有关事件代理支持的字符和语法的详细信息,请参阅主题支持和语法。

主题具有以下属性:

  • 名称:代表要发布和/或订阅的主题的字符串。
  • 持久性:即主题是临时的(临时主题的作用域和生命周期是创建它的会话)还是非临时的(在工厂级别创建)。
  • 是否启用接收全部仅传递给一个标志:当主题在消息中匹配时,它将覆盖已启用仅传递给一个标志的已发布消息。因此,如果消息中的主题匹配,它将传递给具有接收全部仅传递给一个标志的主题的客户端,以及任何订阅该主题而没有此覆盖的客户端。

使用 JCSMP API 时,为订阅创建主题与为目的地创建主题(对于直接消息,请参阅在 PubSub+ JCSMP API 中创建主题;对于保证消息,请参阅在 PubSub+ JCSMP API 中创建主题)遵循相同的流程。

有关如何添加主题订阅的示例,请参阅 Solace 开发者中心中的 DirectPubSub 示例。

会话级别对订阅操作的控制

会话级别的一些控制可以影响订阅操作,它们是:

  • 网络 I/O 阻塞和非阻塞模式
  • 在重新连接时重新应用订阅
  • 设置订阅者优先级级别

网络 I/O 阻塞和非阻塞模式

对于 JCSMP,所有订阅和取消订阅操作都使用阻塞模式。当使用阻塞模式时,每个发送调用的调用线程将被阻塞,直到 API 可以接受消息。因此,应用程序自动控制发送调用的速率,以便事件代理可以接受它们。发送调用将保持阻塞状态,直到 API 接受它,或者阻塞写入计时器超时。

在重新连接时重新应用订阅

默认情况下,客户端连接到的事件代理不会维护该客户端的订阅(即,默认情况下,订阅是非持久的)。然而,可以通过为会话启用重新应用订阅属性,使 API 记住客户端添加或删除的所有订阅,并且如果会话失败,客户端的最后一个订阅集将在成功重新连接时自动重新应用于事件代理。因此,启用重新应用订阅属性实际上使客户端的订阅变得持久。

此属性不适用于端点订阅。端点订阅由事件代理维护(即,应用于队列的主题订阅是持久的)。如果客户端使用临时队列并且断开连接超过一分钟,临时队列将从事件代理中移除,并在客户端重新连接时自动重新创建。然而,即使启用了 REAPPLY_SUBSCRIPTIONS,订阅也不会重新应用。

如果在重新应用订阅时发生错误,通道连接将被标记为关闭,并且客户端将根据会话的配置重新连接属性尝试重新连接(参阅重新连接重试)。必须成功重新应用订阅才能重新建立连接。

要启用订阅的重新应用,请使用 JCSMPProperties.REAPPLY_SUBSCRIPTIONS 属性。有关如何在会话重新连接时重新应用订阅的示例,请参阅 Solace 开发者中心中的 DirectPubSub 示例。

设置订阅者优先级级别

要控制哪些客户端接收仅传递给一个消息,客户端被分配一个本地订阅者优先级。本地优先级是客户端订阅接收直接消息发布的优先级。订阅者优先级级别范围从 1(最高)到 4(最低)。

当使用仅传递给一个功能发布消息时,具有最高订阅者优先级级别的本地客户端将接收消息,如果多个客户端共享该订阅者优先级级别,则以轮询方式选择一个客户端。

如果没有本地客户端匹配订阅,消息可能会传递给连接到邻居事件代理的一个客户端。

要设置订阅者优先级,请使用 JCSMPProperties.SUBSCRIBER_LOCAL_PRIORITY 属性。有关如何使用仅传递给一个功能发布和订阅消息的示例,请参阅 Solace 开发者中心中的 DTOPubSub 示例。

添加主题订阅

在发布/订阅消息传递域中,客户端可以使用主题订阅来吸引感兴趣的消息。

要向事件代理添加主题订阅,请调用适用于所用消息传递 API 的方法或函数,并传入主题订阅。您还可以设置可选的订阅标志来控制 API 调用的行为。

可以设置的订阅标志包括:

  • 等待确认
  • 接收全部仅传递给一个

仅包含“>”字符的主题订阅将吸引所有发布的消息,无论其主题是什么,并且它作为一个始终传递订阅(即,它覆盖了已发布消息中启用的仅传递给一个标志)。 Kimi: 要添加订阅,请使用 JCSMPSession.addSubscription(...) 方法。有关如何添加主题订阅的示例,请参阅 Solace 开发者中心中的 DirectPubSub 示例。

代表其他客户端管理主题订阅

客户端可以作为订阅管理器,为同一消息 VPN 中的其他客户端添加和移除主题订阅。要成为订阅管理器,客户端必须使用配置为订阅管理器的客户端用户名连接到路由器。这些客户端被称为 OBO(代表)代理,或 OBO 订阅管理器。使用 OBO 订阅管理器可以集中管理哪些客户端获得哪些订阅。有关如何为客户端用户名启用订阅管理器功能的信息,请参阅配置订阅管理器。

  • 只有直接消息可以通过代表其他客户端创建的主题订阅接收。
  • 订阅管理器只能代表客户端添加直接消息的主题订阅。它不一定有权修改这些客户端拥有的保证消息传递端点(队列或主题端点)的订阅。
  • 订阅管理器必须为客户端创建一个客户端名称端点,才能为该客户端添加或移除主题订阅。当代表其他客户端添加订阅时,它们表现得与其他订阅一样。例如,如果客户端断开连接,订阅管理器添加的订阅将被移除。断开订阅管理器的连接不会影响已添加的订阅。

对于 PubSub+ JCSMP API,必须首先为要管理订阅的每个客户端创建一个客户端名称端点实例。一旦创建了客户端名称端点实例,订阅管理器就可以向该客户端名称端点实例添加或移除主题订阅。

要代表其他客户端管理主题订阅,请使用以下方法:

  • JCSMPFactory.createClientName(...)
  • JCSMPSession.addSubscription(...)
  • JCSMPsession.removeSubscription(...)

有关如何使用订阅管理器客户端代表其他客户端添加主题订阅的示例,请参阅 Solace 开发者中心中的 SubscribeOnBehalfOfClient.java

移除订阅

您也可以设置可选的订阅标志来控制 API 调用的行为。这些标志与添加订阅的对应标志相同。要移除订阅,请使用 JCSMPsession.removeSubscription(...) 方法。有关如何移除主题订阅的示例,请参阅 Solace 开发者中心中的 DirectPubSub 示例。