最近調整了原先的一箇中間件的功能,把之前被產品去掉的規則表達式計算又重新添了回去.
這個中間件的基本功能是使用預定義的關鍵字和數值比對進行判斷,從大量的數據中生成告警,主要是用於服務器監控.
這裏的表達式計算僅使用了與邏輯相關的一些運算符.
原本是自己寫了一個基於stack的表達式計算,後來被產品去掉了這個功能,說是用不到這種…然而這次的需求需要進行復雜的多規則計算,因此需要在現有的基礎上重新添加回表達式計算功能.
爲以後擴展起見,原本是使用java自帶的js引擎進行計算,然而在實現了之後,自測性能時發現內存佔用率過高.
後續找了一下開源的表達式計算引擎,話說網上能找到的計算引擎介紹全部都是一樣的…後面試了幾個,最終選擇了JEP
,效率和內存佔用都比較符合要求.
介紹一下簡單的使用
由於JEP在maven上有很多實現,試過了幾個後選擇了
<dependency>
<groupId>com.singularsys</groupId>
<artifactId>jep</artifactId>
<version>3.5</version>
</dependency>
引擎本身支持數學運算,但我只使用了其邏輯運算的一部分
String exp = "a&&(b||c)";
Jep jep=new Jep();
jep.parse(exp);
jep.addVariable("a",true);
jep.addVariable("b",true);
jep.addVariable("c",true);
jep.evaluate();
使用方式非常簡單
- 構造Jep
- 解析表達式字符串
- 給表達式中的變量賦值
- 計算
需要注意的是給變量賦值的操作是可以重複進行的.不要重複解析表達式.
doc文檔看這裏