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 規範指出,在選取器中使用字串屬性時,不應將其轉換為數值。例如,如果訊息的 age
屬性設定為 String
21
,則以下選取器不應符合它:age > 18
。由於 Apache ActiveMQ Artemis 支援只能傳送具有字串屬性的訊息的 STOMP 用戶端,因此該限制有點局限性。因此,如果您希望篩選表達式將 String
屬性自動轉換為適當的數字類型,只需在其前面加上 convert_string_expressions:
。如果您將上一個範例中的篩選表達式更改為 convert_string_expressions:age > 18
,則它會符合上述訊息。
JMS 和 Jakarta Messaging 規範還指出,屬性識別符號(因此,在篩選表達式中有效使用的識別符號)是
由字母和數字組成的無限長序列,第一個必須是字母。字母是
Character.isJavaLetter
方法返回true
的任何字元。這包括_
和$
。字母或數字是Character.isJavaLetterOrDigit
方法返回true
的任何字元。
此限制表示無法使用連字號(即 -
)。但是,可以使用 hyphenated_props:
前置詞來克服此限制。例如,如果訊息的 foo-bar
屬性設定為 0
,則篩選表達式 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