㈠ Drools集成SpringBoot
為了更好的在項目中使用Drools,
需要把Drools集成到Spring Boot,
下面介紹集成的方法,
並且開發簡單的Demo和測試用例。
pom.xml工程信息:
引入spring-boot-starter-web作為Web工程,對外提供Rest服務,
引入spring-boot-starter-log4j2日誌框架,列印測試匹配結果,
引入spring-boot-starter-test測試框架,開發Junt5測試用例:
通過kie-spring引入Drools相關的jar包,
其依賴的spring版本都排除掉,
以上一步的spring boot依賴為准。
啟動類DroolsApplication.java:
操作的對象Person,
Person.java:
對外提供的Rest服務,
可以對Person對象進行規則匹配,
提供了兩個介面,
單個和批量的操作介面:
PersonRuleController.java:
在上面PersonRuleController中需要用到KieContainer,
這個必須在Spring中先初始化才能使用,
相關功能由DroolsAutoConfiguration.java提供:
在DroolsAutoConfiguration中指定了drl規則文件
所在目錄rules/com/ai/prd/,
在src/main/resources/rules/com/ai/prd/目錄下新建文件
ai-rules.drl:
規則1匹配名字為bob的人,並且調用工具類PersonRuleAction列印相關日誌,
同時列印規則的名稱和包路徑到控制台。
規則2匹配年齡在25到65之間的打工人,
然後把匹配到的人直接列印到控制台。
PersonRuleAction.java在匹卜孫消配到相應規則時被調用,
此處僅實現日誌列印的功能:
在src/main/resources目錄下,
新建日誌配置文件Log4j2.xml:
日誌文件配置後,
PersonRuleAction類列印的日誌
不僅會輸出到log/rule_result.log,
也會輸出到控制台。
針對上面PersonRuleController提供的Rest介面,
開發兩個Junit5的測試用例,型知
在src/test/java/目錄下
創建PersonRuleControllerTest.java:
PersonRuleControllerTest執行後,
控制台輸出:
cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieMole
大概率是rule規則文件有問題,
格式,中英文字元,語法等問題,
請確保規則文件正確。
可以安裝相應插件打開規則文件,
請參考:
Drools的Eclipse_IDEA插件安裝
Drools規則引擎 系列教程(一)SpringBoot整合 & 快速集成上手
《Drools7.0.0.Final規凱襲則引擎教程》之Springboot集成
Drools創建Maven工程
㈡ Linux系統udev規則文件
udev的規則文件以行為單位,以「#」開頭的行代表注釋行。其餘的每一行代表一個規則。每個規則分
成一個或多個匹配部分和賦值部分。匹配部分用匹配專用的關鍵字來表示,相應的賦值部分用賦值專用的
關鍵字來表示。匹配關鍵字包括:ACTION(行為)、KERNEL(匹配內核設備名)、BUS(匹配匯流排類
型)、SUBSYSTEM(匹配子系統名)、ATTR(屬性)等,賦值關鍵字包括:NAME(創建的設備文件
名)、SYMLINK(符號創建鏈接名)、OWNER(設置設備的所有者)、GROUP(設置設備的組)、
IMPORT(調用外部程序)、MODE(節點訪問許可權)等。
例如,如下規則:
SUBSYSTEM=="net"
, ACTION=="add"
, DRIVERS==" *"
, ATTR{address}=="08:00:27:35:be:ff"
,
ATTR{dev_id}=="0x0"
, ATTR{type}=="1"
, KERNEL=="eth*"
, NAME="eth1"
其中的「匹配」部分包括SUBSYSTEM、ACTION、ATTR、KERNEL等,而「賦值」部分有一項,是
NAME。這個規則的意思是:當系統中出現的新硬體屬於net子系統范疇,系統對該硬體採取的動作
是「add」這個硬體,且這個硬體的「address」屬性信息等於「08:00:27:35:be:ff」
,
「dev_id」屬性等
於「0x0」
、
「type」屬性為1等,此時,對這個硬體在udev層次施行的動作是創建/dev/eth1。
通過一個簡單的例子可以看出udev和devfs在命名方面的差異。如果系統中有兩個USB列印機,一個可
能被稱為/dev/usb/lp0,另外一個便是/dev/usb/lp1。但是到底哪個文件對應哪個列印機是無法確定的,
lp0、lp1和實際的設備沒有一一對應的關系,映射關系會因設備發現的順序、列印機本身關閉等而不確
定。因此,理想的方式是兩個列印機應該採用基於它們的序列號或者其他標識信息的辦法來進行確定的映
射,devfs無法做到這一點,udev卻可以做到。使用如下規則:
SUBSYSTEM="usb"
,ATTR{serial}="HXOLL0012202323480"
,NAME="lp_epson"
,SYMLINK+="printers/
epson_stylus"
該規則中的匹配項目有SUBSYSTEM和ATTR,賦值項目為NAME和SYMLINK,它意味著當一台USB
列印機的序列號為「HXOLL0012202323480」時,創建/dev/lp_epson文件,並同時創建一個符號鏈
接/dev/printers/epson_styles。序列號為「HXOLL0012202323480」的USB列印機不管何時被插入,對應的設
備名都是/dev/lp_epson,而devfs顯然無法實現設備的這種固定命名。
udev規則的寫法非常靈活,在匹配部分,可以通過「*」
、
「?」
、[a~c]、[1~9]等shell通配符來靈活匹配
多個項目。
*類似於shell中的*通配符,代替任意長度的任意字元串,?代替一個字元。此外,%k就是
KERNEL,%n則是設備的KERNEL序號(如存儲設備的分區號)。
㈢ grep命令
grep命令是一個強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行列印出來。
正則表達式是描述一組字元串的一個模式,正則表達式可以是一些純文本文字,也可以是用來產生模式的一些特殊字元。
grep命令在每一個文件或特定輸出中搜索特定的模式,當使用grep時,會輸出跟指定模式匹配的每一行,但是使用grep命令並不改變文件中的內容。
如果發現某文件的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名為-,則grep指令會從標准輸入設備讀取數據。
語法:grep [-abcEFGhHilLnqrsvVwxy][-A<顯示行數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<範本樣式>][-f<範本文件>][--help][範本樣式][文件或目錄...]。
參數:
-a或--text :不要忽略二進制的數據。
-A<顯示行數>或--after-context=<顯示行數>:除了顯示符合範本樣式的那一列之外,並顯示該行之後的內容。
-b或--byte-offset :在顯示符合樣式的那一行之前,標示出該行第一個字元的編號。
-B<顯示行數>或--before-context=<顯示行數>:除了顯示符合樣式的那一行之外,並顯示該行之前的內容。
-c或--count :計算符合樣式的列數。
-C<顯示行數>或--context=<顯示行數>或-<顯示行數>:除了顯示符合樣式的那一行之外,並顯示該行之前後的內容。
-d <動作>或--directories=<動作>:當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息並停止動作。
-e<範本樣式>或--regexp=<範本樣式>:指定字元串做為查找文件內容的樣式。
-E或--extended-regexp :將樣式為延伸的正則表達式來使用。
-f<規則文件>或--file=<規則文件>:指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式為每行一個規則樣式。
-F或--fixed-regexp :將樣式視為固定字元串的列表。
-G或--basic-regexp :將樣式視為普通的表示法來使用。
-h或--no-filename :在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱。
-H或--with-filename :在顯示符合樣式的那一行之前,表示該行所屬的文件名稱。
-i或--ignore-case :忽略字元大小寫的差別。
-l或--file-with-matches :列出文件內容符合指定的樣式的文件名稱。
-L或--files-without-match :列出文件內容不符合指定的樣式的文件名稱。
-n或--line-number :在顯示符合樣式的那一行之前,標示出該行的列數編號。
-o或--only-matching :只顯示匹配PATTERN部分。
-q或--quiet或--silent :不顯示任何信息。
-r或--recursive :此參數的效果和指定"-d recurse"參數相同。
-s或--no-messages :不顯示錯誤信息。
-v或--invert-match :顯示不包含匹配文本的所有行。
-V或--version :顯示版本信息。
-w或--word-regexp :只顯示全字元合的列。
-x --line-regexp :只顯示全列符合的列。
-y :此參數的效果和指定"-i"參數相同。