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 規範指出,在選取器中使用字串屬性時,不應將其轉換為數值。例如,如果訊息的 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