跳到主要内容

使用选择器

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

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

选择器可以设置在:

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

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

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

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

使用选择器从深度队列中检索消息时,也必须考虑性能。Solace 事件代理需要检索队列中的每条消息,可能需要从磁盘中读取,以将消息内容与消费者的表达式进行匹配。如果队列非常深,可能需要几秒钟才能找到第一条匹配的消息。大消息的检索和评估选择器表达式的时间也会更长。这些挑战可以通过使用主题订阅进行过滤来消除,因为过滤发生在事件代理将消息加入队列之前。

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

JMS和PubSub+消息API之间的选择器标识符映射

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

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

JMSCorrelationID = 'myCorrelationId'

如果您使用的是 PubSub+ 消息 API,则可以这样编写相同的表达式:

ci = 'myCorrelationId'

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

JMS 标识符Solace 标识符相关的 Solace 消息属性
消息头字段JMSCorrelationIDciCorrelationId
JMSDeliveryMode不适用DeliveryMode
JMSMessageIDmiApplicationMessageId
JMSPriority不适用Priority
JMSTimestamptsSenderTimestamp
JMSTypemtApplicationMessageType
不适用siSenderID
不适用snSequenceNo
不适用exExpiration
不适用ctHttpContentType
不适用ceHttpContentEncoding
JMS 定义的属性JMSXGroupSeq视为用户指定PubSub+ 消息 API 可以将 JMSX 属性作为用户属性访问,属性名称与 JMS 中使用的相同。
JMSXGroupID视为用户指定
JMSXUserID<client-username>
仅当使用基本客户端身份验证且启用了 jmsx-user-id-enabled 连接工厂属性时,才可用 JMSXUserID 属性。
用户定义的消息属性用户指定用户指定不适用

选择器标识符

在端点上设置选择器

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

  • 队列
    选择器作为队列的出站过滤器。
    当流绑定到独占队列时,流定义的选择器会过滤客户端要消费的消息。未选中的消息保留在队列中,可以被后续绑定的具有不同选择器的流的客户端消费。
    当流绑定到非独占队列时,根据选择器,绑定的客户端以轮询方式消费消息。一旦消息被消费,它将不再对后续客户端可用。

  • 主题端点
    选择器作为主题端点的入站过滤器。
    当流绑定到主题端点时,匹配主题订阅的消息被接收。当流定义了选择器时,消息的头字段和属性与选择器中定义的对应标识符不匹配的消息不会被排队到主题端点。
    如果从持久化主题端点断开连接的流重新绑定,并且选择器被更改,则在流重新绑定时,所有现有消息将被移除。为了避免在重新绑定时移除主题端点的消息,使用的必须与之前绑定时完全相同的选择器字符串。

PubSub+ 消息 API使用方法
Java RTOFlowHandle.PROPERTIES.SELECTOR
CSOLCLIENT_FLOW_PROP_SELECTOR
.NETFlowProperties.Selector
JavaScript 和 Node.js不适用

如何在流上设置选择器

相关示例

有关如何为流设置选择器的示例,请参考适用于相应消息 API 的 messageSelectorsOnQueue 示例。