Artemis支持基于SQL 92子集语法的过滤表达式。与JMS选择器类似,但是预定义标识符不同。过滤语法使用在如下几个地方:
- 预定义队列,在预定义队列时可以在core或者jms的broker.xml中为队列定义过滤表达式。只有与表达式匹配的消息才能进入队列。
- 使用可选的过滤器定义core桥接器,仅桥接匹配的消息。
- 使用可选的过滤器定义转移,仅转移匹配的消息。
- 在创建消费者、队列和在管理记录多个地方可以用编程方式使用过滤器。
在使用core协议的过滤表达式中可以使用以下标识符属性值:
- AMQPriority,用于消息优先级,例如AMQPriority=3 AND animal='aardvark'
- AMQExpiration,用于消息过期时间,值是一个长整型
- AMQDurable,用于消息是否是持久化,有效值为:DURABLE或NON_DURABLE
- AMQTimestamp,用于消息创建的时间戳,值为一个长整型
- AMQSize:用于指定消息大小(单位bytes),值为一个整型
在JMS规范中,不能将String属性值转换为数字。例如,如果消息中age属性值为String 21,则不会匹配这个规则:age>18。但是呢Artemis的STOMP客户端值只能发送字符串属性的消息,这样的限制就限制了过滤功能。如果希望过滤器表达式自动把String属性转换为数字类型,只需用convert_string_expressions:作为前置,如:convert_string_expressions:age>18。
JMS规范中规定属性标识符为:无限长度的字母和数字序列,第一个必须是字母。字母是任何能通过字符方法Character.isJavaLetter调用后能返回true,包括_和$。则字母或数字是任何Character.isJavaLetterOrDigit方法返回true的任何值。此约束意味着不能使用连接符(-),如果要使用需要加上hyphenated_props:前缀,如:hyphenated_props:foo-bar=0。
注:此系列文章为Apache Artemis V2.6.2官方使用文档的简要翻译文档(非完全按照官方文档排版进行翻译,有删减),个人能力有限如有错误请谅解。源文档地址:http://activemq.apache.org/artemis/docs/latest/index.html