跳到主要内容

在PubSub+ JCSMP API中使用选择器

选择器允许使用 PubSub+ JCSMP API 的客户端指定它们感兴趣的接收消息,这由消息的头字段和属性值决定。选择器是一个最多 2,000 字节的字符串,使用 SQL92 的子集条件表达式语法。有关消息选择器语法的详细信息,请参阅《Java 消息服务规范 - 1.1 版》。

当使用选择器时,只有当消息的头字段和属性值替换选择器中相应的标识符时,选择器计算结果为 true,客户端才会接收消息。事件代理会过滤掉不匹配的消息。

选择器可以设置在:

  • 绑定到队列或主题端点的流。参阅在端点上设置选择器。
  • 浏览器或浏览器流。参阅在 PubSub+ JCSMP API 中浏览保证消息。

使用选择器时的性能注意事项

尽管完全支持选择器,但通常使用不带选择器的主题匹配可以实现最佳性能。在许多情况下,可以在主题层次结构中包含将被选择的消息属性。然后可以使用主题订阅和主题订阅异常来匹配主题中的相关级别,以实现类似选择器表达式的匹配。

主题订阅和主题订阅异常支持在级别内使用通配符和前缀匹配。通过使用通配符、异常以及为队列或主题端点指定多个订阅或异常,可以实现类似 AND、OR 和 NOT 的匹配操作。

使用选择器从深度队列中检索消息时也必须考虑性能。Solace 事件代理可能需要检索队列中的每条消息,甚至可能从磁盘中检索,以评估其内容是否符合消费者的表达式。如果队列非常深,可能需要几秒钟才能找到第一条匹配的消息。大消息的检索和评估时间也会更长。这种行为可能会影响事件代理消息存储性能,甚至可能影响不使用选择器的客户端。当使用主题订阅进行过滤时,这些挑战被消除,因为过滤发生在事件代理将消息添加到队列之前。

一般来说,应尽可能避免使用选择器。

JMS和Solace API之间的选择器标识符映射

下表列出了标准 JMS 标识符及其等效的 Solace 标识符。Solace 标识符作为保留键编码在 Solace SMF 消息的结构化数据映射中。可以使用这两种类型的标识符来定义选择器。

例如,JMSCorrelationID 在映射中用键 ci 编码。如果您使用 JMS API 并且只想匹配相关 ID(这是一个字符串)为 "myCorrelationId" 的消息,您可以在 JMS 中编写如下选择器表达式:

JMSCorrelationID = 'myCorrelationId'

如果您使用的是 Solace 消息传递 API,可以这样编写相同的表达式:

ci = 'myCorrelationId'

JMS 可能没有为某些 Solace 标识符设置方法,例如消息序列号(sn),但仍然可以对 sn 标识符进行选择。

JMS 标识符Solace 标识符相关的 Solace 消息属性
消息头字段JMSCorrelationIDciCorrelationId
JMSDeliveryModeNADeliveryMode-
JMSMessageIDmiApplicationMessageId-
JMSPriorityNAPriority-
JMSReplyTortReplyTo-
JMSTimestamptsSenderTimestamp-
JMSTypemtApplicationMessageType-
NAsiSenderID-
NAsnSequenceNo-
NAexExpiration-
NActHttpContentType-
NAceHttpContentEncoding-
JMS 定义的属性JMSXGroupSeq视为用户指定Solace 消息传递 API 可以将 JMSX 属性作为用户属性访问,属性名与 JMS 中使用的相同。
JMSXGroupID视为用户指定-
JMSXUserID<client-username>
仅当使用基本客户端身份验证并且启用了 jmsx-user-id-enabled 连接工厂属性时,才可用 JMSXUserID 属性。-
用户定义的消息属性用户指定用户指定-

选择器标识符

在端点上设置选择器

可以在绑定到队列或主题端点的流上设置选择器。选择器在每种端点类型上的作用不同:

  • 队列

选择器作为队列的出站过滤器。

当流绑定到独占队列时,流定义的选择器过滤客户端要消费的消息。未选中的消息保留在队列中,可以在后续绑定到具有不同选择器的流的客户端中消费。

当流绑定到非独占队列时,根据它们的选择器,绑定的客户端以轮询方式消费消息。一旦消息被消费,它将不再对后续客户端可用。

  • 主题端点

选择器作为主题端点的入站过滤器。

当流绑定到主题端点时,匹配主题订阅的消息被该主题端点接收。当流定义了选择器时,消息头字段和属性不符合选择器中定义的相应标识符的消息不会被排队到主题端点。

如果从持久主题端点断开流的连接,并且更改了选择器,则当流再次绑定时,所有现有消息将被移除。为了在重新绑定时防止移除主题端点的消息,使用的必须与前一次绑定时完全相同的选择器字符串。

PubSub+ 消息传递 API使用方法
JCSMPConsumerFlowProperties.setSelector(...)
Java RTOFlowHandle.PROPERTIES.SELECTOR
CSOLCLIENT_FLOW_PROP_SELECTOR
.NETFlowProperties.Selector
JavaScript 和 Node.js不适用

要为流设置选择器

相关示例

有关如何为流设置选择器的示例,请参阅相应消息传递 API 的 messageSelectorsOnQueue 示例。