Apache ActiveMQ Artemis 提供了一种强大的基于 SQL 92 表达式语法子集的过滤器语言。

它与用于 JMS 和 Jakarta Messaging 选择器的语法相同,但预定义的标识符不同。有关 JMS 选择器语法的文档,请参阅 javax.jms.Message 的 JavaDoc。有关相应的 Jakarta Messaging JavaDoc,请参阅 jakarta.jms.Message

过滤器表达式在 Apache ActiveMQ Artemis 中的多个地方使用。

  • 预定义队列。在预定义队列时,在 broker.xml 的核心或 JMS 配置中,可以为队列定义过滤器表达式。只有与过滤器表达式匹配的消息才会进入队列。

  • 核心桥梁可以定义可选的过滤器表达式,只有匹配的消息才会被桥接(参见 核心桥梁)。

  • 可以定义带有可选过滤器表达式的分流器,只有匹配的消息才会被分流(参见 分流器)。

  • 在创建消费者、队列以及 管理 中描述的几个地方,过滤器也用于以编程方式使用。

JMS 选择器表达式和 Apache ActiveMQ Artemis 核心过滤器表达式之间存在一些差异。JMS 选择器表达式对 JMS 消息进行操作,而 Apache ActiveMQ Artemis 核心过滤器表达式对核心消息进行操作。

以下标识符可以在核心过滤器表达式中使用,以引用表达式中核心消息的属性

AMQUserID

消息发送时由用户设置的 ID。这类似于基于 JMS 的客户端的 JMSMessageID

AMQAddress

消息发送到的地址。

AMQGroupID

发送消息时使用的组 ID。

AMQPriority

引用消息的优先级。消息优先级是整数,有效值从 0 - 90 是最低优先级,9 是最高优先级。例如 AMQPriority = 3 AND animal = 'aardvark'

AMQExpiration

引用消息的过期时间。该值是一个长整数。

AMQDurable

引用消息是否持久。该值是一个字符串,有效值为:DURABLENON_DURABLE

AMQTimestamp

消息创建的时间戳。该值是一个长整数。

AMQSize

消息的大小(以字节为单位)。该值是一个整数。

核心过滤器表达式中使用的任何其他标识符将被假定为消息的属性。

JMS 和 Jakarta Messaging 规范指出,字符串属性在选择器中使用时不应该转换为数字。例如,如果消息具有设置为 String 21age 属性,则以下选择器不应匹配它:age > 18。由于 Apache ActiveMQ Artemis 支持 STOMP 客户端,而 STOMP 客户端只能发送具有字符串属性的消息,因此该限制有点限制。因此,如果您希望过滤器表达式自动将 String 属性转换为适当的数字类型,只需在它前面添加 convert_string_expressions:。如果您将上一个示例中的过滤器表达式更改为 convert_string_expressions:age > 18,那么它将与上述消息匹配。

JMS 和 Jakarta Messaging 规范还指出,属性标识符(因此也是过滤器表达式中有效的标识符)是一个

无限长度的字母和数字序列,第一个必须是字母。字母是任何使 Character.isJavaLetter 方法返回 true 的字符。这包括 _$。字母或数字是任何使 Character.isJavaLetterOrDigit 方法返回 true 的字符。

此约束意味着不能使用连字符(即 -)。但是,可以通过使用 hyphenated_props: 前缀来克服此约束。例如,如果消息具有设置为 0foo-bar 属性,则过滤器表达式 hyphenated_props:foo-bar = 0 将与它匹配。

1. XPath

Apache ActiveMQ Artemis 还支持对消息的正文进行操作的特殊 XPath 过滤器。正文必须是 XML。要使用 XPath 过滤器,请使用此语法

XPATH '<xpath-expression>'

XPath 过滤器在使用以下协议的生产者和消费者之间得到支持

  • OpenWire JMS

  • 核心(和核心 JMS)

  • STOMP

  • AMQP

由于 XPath 应用于消息的正文并需要解析 XML,它可能比普通过滤器慢得多

不支持大型消息。

用于 XPath 的 XML 解析器使用以下默认“功能”进行配置

  • http://xml.org/sax/features/external-general-entities: false

  • http://xml.org/sax/features/external-parameter-entities: false

  • http://apache.org/xml/features/disallow-doctype-decl: true

但是,为了处理任何特定于实现的问题,可以通过使用以 org.apache.activemq.documentBuilderFactory.feature: 为前缀的系统属性来自定义这些功能,例如

-Dorg.apache.activemq.documentBuilderFactory.feature:http://xml.org/sax/features/external-general-entities=true