不論使用哪種規則型技術,
規則庫處理程序皆涉及三個基本領域,包括:構成語言的詞彙、用以表達陳述式中之詞彙的文法,
以及規格處理引擎。本文探討規則庫處理程序的前兩個領域。
詞彙
詞彙由運算子、當成運算元使用的變數關鍵字,以及控制流程陳述式組成。在本功能中,
所選的語言為「Java 傳訊服務 (JMS)」。特別是「訊息選取器語法」。訊息選取器是一種字串,
其語法是以一個 SQL92 條件表示式子集為基礎。在這個應用程式中,
將用它來表達一項分類規則。一般的陳述式語法為:
expression; 其中的 expression 為一個有效的 SQL 查詢(其中的條件式子句含有述語),
而分號 (;) 為陳述式終止符號。
當表示式評估為 true 時,會對適當的原則、遞送或 WSMM 採取 permit(允許)、
reject(拒絕)、redirect(重新導向)等動作。若為 false,則會套用預設的條件。permit(允許)、
reject(拒絕)等動作是由原則提供程式(ROUTING 和 WSMM)所提供。例如,
以下的陳述式即為一種條件表示式:
serverhost like ‘blanca%’ and protocol in (‘HTTP’,’SOAP’);
不過,從實作觀點來看,上述的條件表示式將留存在 XML 規則檔中;
因此,動作、原則提供程式和表示式都是規則元素的屬性。
專有名詞
- 規則 - 一種代表非元素型格式中之陳述式的元素。
- 表示式 - 為規則元素中的一個屬性,屬於條件式。
- 規則集 - 一或多項規則的集合。
- 陳述式 - 非元素型格式中所述的一項規則,這和 JMS 訊息選取器表示式中的一樣。
以下是一組分別當成運算子和運算元之關鍵字的定義。
運算子
WebSphere Application Server Extended
Deployment 6.0 版在規則表示式中支援下列的運算子。一般而言,
您不見得知道給定運算元的實際資料類型。不過,
您將遵循 HTTP 方法,將每一個運算元視為一個資料類型字串,
並使用運算子作為運算元之實際資料類型的指示元,以進行資料驗證。在 SQL 專有名詞中,
這些運算子也稱為述語,
這是因為它們是出現在 WHERE 或 HAVING 子句內。運算子不區分大小寫。
- OR - 邏輯 OR 運算子。
- AND - 邏輯 AND 運算子。
- NOT - 否定句運算子。
- IN - IN 運算子用以在單一表示式中表達一個使用多值的運算元。其意義和運算子的 SQL 標準意義一致。比方說,
假設有一個稱為 port 運算元,
而使用者想表達該 port 值可以是任何或所有的值(如 9080、9090、9091),
則表示式片段為 port IN (9080,9090, 9091)。在 SQL 中,如何表達括弧內的值,
取決於 port 的資料類型而定。也就是說,如果 port 的類型為整數(通常是數字),
則未括上單引號的值就語法來說是正確的。如果 port 為資料類型字串,則正確的表示式為
port IN (‘9080’, ‘9090’, ‘9091’)。
- LIKE - LIKE 運算子用以表達將對字串運算元值進行型樣比對,
而其意義與用法和 SQL 語言中所定義的一致。其值必須含有萬用字元 (%),
且位於預計進行型樣比對的起始處。例如,host LIKE %blanca 表示式將比對出
blanca 單字或結尾是 blanca 的其他任何單字;
host LIKE blanca% 表示式將比對出 blanca 單字或開頭為
blanca 的其他任何單字;host LIKE %blanca% 將比對出
blanca 單字或任何內嵌 blanca 記號的單字。從程式碼實作來說,
將使用 java.util.regex.Pattern 類別。
- = 相等運算子,用來在區分大小寫的形式中表達一個相符項。
- > 大於運算子,將搭配數值運算元使用。
- >= 大於或等於運算子,將搭配數值運算元使用。
- < 小於運算子,將搭配數值運算元使用。
- <= 小於或等於運算子,將搭配數值運算元使用。
- BETWEEN - 這個運算子會搭配 AND 使用,用以選取介於第一個(低)值和最後一個
(高)值在內的值範圍。它們將一起運作在數字和日期值上。
- EXISTS - 一種 Boolean 運算子,用以檢查某個運算元是否存在,
或某個複合子表示式的結果。例如,檢查某些 HTTP Header 元素屬性是否存在。
運算元
運算元有區分大小寫,在此是以小寫字母來定義,且不容許使用
底線 (_)。不過,如果運算元由多個單字組成,
則會採 camelback 形式,將每一個連續單字的第一個字母變成大寫。
- clientipv4 – 採用 IPv4 點式四碼位址類型 n.n.n.n 的用戶端機器 IP 位址。
- clientipv6 – 遵循 RFC 1924 的用戶端機器 IPv6 128 位元位址類型 x:x:x:x:x:x:x:x。
- serveripv4 – 採用 IPv4 點式四碼位址類型 n.n.n.n 的伺服器機器 IP 位址。
- serveripv6 – 遵循 RFC 1924 的伺服器機器 IPv6 128 位元位址類型 x:x:x:x:x:x:x:x。
- clienthost – 用戶端系統的名稱。這是 IP 指令主機名稱的值。這個運算元不支援數值運算子,例如 >、
>=、<、<=。
- serverhost – 伺服器系統的名稱。這是 IP 指令主機名稱的值。這個運算元不支援數值運算子,例如 >、
>=、<、<=。
- port – 主機中提供服務之埠。
- protocol – 傳輸要求時所用的通訊協定。支援的通訊協定有:HTTP、HTTPS、SOAP 和 IIOP。未來或許可支援更多通訊協定,
但在語意上不需要任何的變更。
- duration – 要求可供分類的時間範圍。一旦要求超過這個時間範圍,
則會套用預設行為。duration 將進一步分為:
- startDate:以語言環境為基礎來設定格式的 GregorianCalendar 起始日期(以作為呈現、UI 用),
其格式為 day-of-week mm/dd/yyyy hh:mm:ss。如果沒有指定時間部分,且使用下列一項限制,
則會採用其時間。
- endDate:以語言環境為基礎來設定格式的 GregorianCalendar 結束日期(以作為呈現、UI 用),
其格式為 day-of-week mm/dd/yyyy hh:mm:ss。如果沒有指定時間部分,且使用下列一項限制,
則會採用其時間。如果沒有指定結束日期,則結束日期會是無限。
- 另外,所提供的預錄常數可搭配 startDate 和 endDate 使用。它們可用來進一步限制時間範圍,
如果沒有指定,則會預設為這段範圍中的 24/7。名稱無法編輯,而值可以變更,
但依預設,會使用本文件中指定的值。它們是:
- WORKING_HOURS - 週一到週五上午 8 點到下午 5 點。
- WEEKEND – 週六和星期日從週五半夜 12 點起到週日半夜 12 點。
- OFFSHIFT_HOURS – 週一到週五下午 5:01 到上午 7:59。
WORKING_HOURS - 週一到週五上午 8 點到下午 5 點。WEEKEND – 週六和星期日從週五半夜 12 點起到週日半夜 12 點。OFFSHIFT_HOURS – 週一到週五下午 5:01 到上午 7:59。
- uri – 要求的 URI;可以是以正規表示式比對出的型樣。若要完全相符,請使用 = 運算子。
- uid – 要求傳送端的使用者 ID。
- gid – 要求傳送端的群組 ID。
- scope$name, scope$value – 這些運算元將用在一般名稱/值配對上,
以當成 URL、Cookie、標頭等的參數使用。另外,scope$name 還附帶一項要求,它必須是一個有效的 Java ID。範圍可以是標頭、Cookie 或 queryparm,
以指定名稱在要求中的位置。它將和名稱/值配對中的名稱相比較,
若有指定一值,則邏輯 AND 運算子會搭配對應值一起使用。例如,
規則將評估查詢參數 ticker,且值為 IBM,則其類似如下:queryparm$name=‘ticker’
AND queryparm$value = ‘IBM’; 請注意,如果只是要檢查名稱 ticker 是否存在,
則陳述式為 queryparm$name=‘ticker’;
給定的規則可有多個名稱/值配對,且評估順序是從第一個到最後一個。如果名稱/值配對本身在規則中重複出現,
則會優先採用最後評估的一個。