規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現了將業務決策從應用程序代碼中分離出來,並使用預約義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,並根據規則作出業務決策。git
規則引擎可以將業務決策邏輯從系統邏輯中抽離出來,使兩種邏輯獨立於彼此而變化,這樣能夠明顯下降兩種邏輯的維護成本。github
好比說在物聯網平臺中,鏈接的設備種類繁多,數據格式,數據類型不統一,但又要面臨接入新設備的需求,不能說每接入一種設備,都要寫一套設備數據處理的邏輯,而後升級發佈系統的功能,設備處理邏輯能夠寫,但要能最低限度的影響平臺的功能。這個時候,咱們最好須要一套規則引擎來靈活的處理各類設備的數據。編程
已經知道了爲何要作規則引擎,要怎麼處理呢,參考QLExpress使用說明文章:www.jianshu.com/p/c1fa9c4a0…bash
QLExpress是一種Java的規則引擎,能夠動態的執行腳本,而且能夠綁定一些咱們寫好的Java函數做爲動態執行腳本的操做。那麼咱們將數據處理中最通用的內容封裝爲一個個QLExpress的組件,在數據處理的時候直接拿來使用便可。其實咱們能夠考慮只是數據的處理,可能會有哪些組件:tcp
我以爲上面這幾個組件能夠知足大部分的數據場景了,有來源,有處理,有反饋。固然在業務複雜的狀況下,可能會不斷的增長新的組件,可是每次增長要想想,這個組件真的有須要嗎?編程語言
另外由於QLExpress已經支持動態腳本了,具備必定編程語言的特性,足夠的靈活處理,封裝咱們的組件只是爲了那些更加通用,經常使用的場景,而最通用的東西通常不會不少。函數
1 整理好系統中最經常使用的功能,進行封裝,將最經常使用的功能以某種方式(配置文件,動態加載),註冊爲QLExpress的某個操做符上。以下測試
runner.addFunctionOfClassMethod("取絕對值", Math.class.getName(), "abs",
new String[] { "double" }, null);
runner.addFunctionOfClassMethod("轉換爲大寫", BeanExample.class.getName(),
"upper", new String[] { "String" }, null);
runner.addFunctionOfServiceMethod("打印", System.out, "println",new String[] { "String" }, null);
runner.addFunctionOfServiceMethod("contains", new BeanExample(), "anyContains",
new Class[] { String.class, String.class }, null);
複製代碼
2 在不一樣的業務場景下,編寫QLExpress語句,能夠利用上一步註冊到QLExpres上的功能簡化語句。雖然是動態腳本可是要足夠簡單,業務要作到不用寫幾句代碼就能知足此次需求,若是要寫太多的語法,那就有點不太友好了。spa
3 在每一個編寫的規則上,提供規則執行測試腳本,數據隔離防止產生髒數據,校驗規則腳本可否正確執行。設計
4 將規則引擎的功能集成到平臺上。
QLExpress腳本引擎被普遍應用在阿里的電商業務場景中,支持常見的編程語法,足夠強大,在QLExpress基礎之上打造本身的業務規則引擎。