跳到主要内容

向端点添加订阅

通常,消息发布到队列时,队列被设置为消息的目标。然而,您也可以为队列添加主题订阅,以便它接收发布到匹配主题目标的任何消息。

如下图所示,当为队列添加主题订阅时,发布到主题的消息可以被发送到队列、主题端点,也可以直接发送到消息总线,在那里它可以与客户端的主题订阅匹配。

发布到主题的消息的可能路由

向队列添加订阅

客户端可以绑定到队列或不绑定到队列,都可以添加或移除主题订阅,但队列必须至少具有修改主题的权限(参阅为非所有者客户端配置权限),客户端才能向队列添加主题订阅或从中移除主题订阅。

客户端无法移除管理员通过 Solace CLI 或 SolAdmin 添加到队列的主题订阅。

当队列被删除时,该队列的所有主题到队列的映射也会被删除。

如果持久化或非持久化消息发布到与队列订阅匹配的主题,但事件代理无法将消息存储到队列中(例如,如果消息大小超过队列配置的大小限制,或者队列已超出配额),则该消息将被丢弃。发布者是否收到拒绝(NACK)取决于队列的 reject-msg-to-sender-on-discard 设置,该设置在事件代理上默认启用。有关更多信息,请参阅配置消息丢弃处理。

要向队列添加主题订阅,请调用适用于所使用消息 API 的以下方法或函数之一,并传入队列名称和要添加到该队列的主题。

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

  • 等待确认
  • 请求确认(适用于 Java RTO、C 和 .NET)
PubSub+ 消息 API调用方法
JCSMPJCSMPSession.addSubscription(...)
Java RTOSessionHandle.subscribe(...)
CsolClient_session_endpointTopicSubscribeExt(...)
.NETISession.Subscribe(...)
JavaScript 和 Node.jsmessageConsumer.addSubscription(...)

如何向队列添加主题订阅

相关示例

有关如何向队列添加主题订阅的示例,请参考适用于相应消息 API 的 TopicToQueueMapping 示例。

使用自定义回调向队列添加订阅

当使用 Java RTO、C 或 .NET API 时,您可以向绑定到队列的流添加主题订阅,并使用特定的消息接收回调或委托来处理接收到的匹配主题的保证消息。此功能也称为主题分发,因为具有特定主题的消息会被分发到特定的回调或委托。

默认情况下,每个带有自定义回调或委托的主题订阅都会被添加到事件代理中,并且当不再有自定义回调或委托与订阅关联时,它会被移除。然而,您可以使用“仅本地分发”订阅标志来添加一个使用特定回调或委托的主题订阅,而不会将订阅添加到事件代理中。

如果由于某种原因消息无法投递到队列,不会向发布客户端返回错误指示(即,对发布客户端的反馈与消息终止在主题端点时相同)。

PubSub+ 消息 API调用方法
JCSMP不适用
Java RTOFlowHandle.subscribe(...) 并传入以下内容:
  • MessageDispatchTargetHandle
  • 可选订阅标志
  • 消息相关性键
    MessageDispatchTargetHandle 封装了主题订阅和消息回调。调用 Solclient.Allocator.newMessageDispatchTargetHandle(...) 来创建一个。 | | C | solClient_flow_topicSubscribeWithDispatch(...) 并传入以下内容:
  • 绑定到队列的流
  • 要添加的主题订阅
  • 消息接收回调信息
  • 可选订阅标志 | | .NET | IMessageDispatcher.Subscribe(...) 并传入 IDispatchTarget 对象和任何可选订阅标志。
    IDispatchTarget 封装了订阅(ISubscription)和消息回调委托(MessageHandler)。调用 IFlow.CreateDispatchTarget() 来创建一个 IDispatchTarget 实例。 | | JavaScript 和 Node.js | 不适用 |

如何向队列添加带有自定义回调的订阅

向队列添加订阅异常

要向给定的持久消息队列添加主题订阅异常,以便发布到该主题的保证消息不会被投递到队列,请重复添加订阅的步骤,并在主题名称前添加一个感叹号("!")作为前缀。换句话说,使用相同的调用创建订阅,并传入带有感叹号前缀的主题参数(形式为 !a/b/c)。

订阅异常默认启用。如果禁用了订阅异常,则感叹号被视为普通字符。有关启用和禁用订阅异常的更多信息,请参阅系统级订阅异常配置。

向主题端点添加订阅

通常,主题端点的流根据创建流时定义的单一主题接收消息。(对于 C API,流属性设置主题;对于 .NET API,传入的 ISubscription 设置主题。)

当使用 Java RTO、C 或 .NET API 时,您可以向绑定到主题端点的流添加额外的主题订阅,并使用特定的消息接收回调或委托来处理这些主题的保证消息。

为带有通配符的主题端点的流分发消息到自定义回调或委托可能非常有用,因为它可以更精确地分离接收到的消息。例如,如果流的主题是 part1/>,它可能会接收到主题为 part1/item1part1/item2 的消息。使用主题分发订阅,您可以配置单独的消息接收回调例程:一个用于发布到 part1/item1 的消息,另一个用于发布到 part1/item2 的消息。

无法动态向事件代理上配置的主题端点添加订阅。因此,带有自定义回调或消息委托的主题端点的订阅仅保存到消息 API 的本地分发表中。这与在向队列添加带有自定义回调或委托的主题订阅时启用“仅本地分发”订阅标志时的行为相同(参阅使用自定义回调向队列添加订阅)。

PubSub+ 消息 API调用方法
JCSMP不适用
Java RTOFlowHandle.subscribe(...) 并传入以下内容:
  • MessageDispatchTargetHandle
  • LOCAL_ONLY 订阅标志(必需)
  • 可选订阅标志
  • 消息相关性键
    MessageDispatchTargetHandle 封装了主题订阅和消息回调。调用 Solclient.Allocator.newMessageDispatchTargetHandle(...) 来创建一个。 | | C | solClient_flow_topicSubscribeWithDispatch(...) 并传入以下内容:
  • 绑定到主题端点的流
  • 要添加的主题订阅
  • 消息接收回调信息
  • 可选订阅标志 | | .NET | IMessageDispatcher.Subscribe(...) 并传入 IDispatchTarget 对象和任何可选订阅标志。
    IDispatchTarget 封装了订阅(ISubscription)和消息回调委托(MessageHandler)。调用 IFlow.CreateDispatchTarget(...) 来创建一个 IDispatchTarget 实例。 | | JavaScript 和 Node.js | messageConsumer.addSubscription(...) 并传入以下内容:
  • 主题目标
  • 可选相关性键
  • 可选超时期限(以毫秒为单位) |

如何向主题端点添加带有自定义回调或委托的订阅

相关示例

有关如何向主题端点添加带有自定义回调或委托的订阅的示例,请参考 Java RTO、C 或 .NET API 的 TopicDispatch 示例。

从端点移除订阅

要移除添加到队列或主题端点的主题订阅,请调用适用于所使用消息 API 的以下方法或函数之一,并传入队列或主题端点、订阅以及任何使用的订阅标志。

PubSub+ 消息 API调用方法
JCSMPJCSMPSession.removeSubscription(...)
Java RTO- FlowHandle.unsubscribe(...)
  • 如果传入端点作为参数,则使用 SessionHandle.unsubscribe(...) | | C | - solClient_session_endpointTopicUnsubscribe(...)
  • solClient_flow_topicUnsubscribeWithDispatch(...) | | .NET | ISession.Unsubscribe(...) | | JavaScript 和 Node.js | messageConsumer.removeSubscription(...) |

如何从端点移除主题订阅