Apache ActiveMQ Artemis 提供了一种强大的基于 SQL 92 表达式语法子集的过滤器语言。
它与用于 JMS 和 Jakarta Messaging 选择器的语法相同,但预定义的标识符不同。有关 JMS 选择器语法的文档,请参阅 javax.jms.Message
的 JavaDoc。有关相应的 Jakarta Messaging JavaDoc,请参阅 jakarta.jms.Message
过滤器表达式在 Apache ActiveMQ Artemis 中的多个地方使用。
JMS 选择器表达式和 Apache ActiveMQ Artemis 核心过滤器表达式之间存在一些差异。JMS 选择器表达式对 JMS 消息进行操作,而 Apache ActiveMQ Artemis 核心过滤器表达式对核心消息进行操作。
以下标识符可以在核心过滤器表达式中使用,以引用表达式中核心消息的属性
- AMQUserID
-
消息发送时由用户设置的 ID。这类似于基于 JMS 的客户端的
JMSMessageID
。 - AMQAddress
-
消息发送到的地址。
- AMQGroupID
-
发送消息时使用的组 ID。
- AMQPriority
-
引用消息的优先级。消息优先级是整数,有效值从
0 - 9
。0
是最低优先级,9
是最高优先级。例如AMQPriority = 3 AND animal = 'aardvark'
- AMQExpiration
-
引用消息的过期时间。该值是一个长整数。
- AMQDurable
-
引用消息是否持久。该值是一个字符串,有效值为:
DURABLE
或NON_DURABLE
。 - AMQTimestamp
-
消息创建的时间戳。该值是一个长整数。
- AMQSize
-
消息的大小(以字节为单位)。该值是一个整数。
核心过滤器表达式中使用的任何其他标识符将被假定为消息的属性。
JMS 和 Jakarta Messaging 规范指出,字符串属性在选择器中使用时不应该转换为数字。例如,如果消息具有设置为 String
21
的 age
属性,则以下选择器不应匹配它: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:
前缀来克服此约束。例如,如果消息具有设置为 0
的 foo-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