drools中使用function的方法小結
一、背景
當我們在drools
中編寫規則時,有些時候存在重復的代碼,那麼我們是否可以將這些重復代碼抽取出來,封裝成一個function
來調用呢?那麼在drools
中如何自定義function
?
二、需求
1、當我們的工作內存中存在Person
對象時,則需要調用drl function
來判斷用戶是否可以玩遊戲。當Person#age >= 18
時可以玩。
2、在then
後面調用java
的靜態方法
。
三、前置知識
1、function語法結構
function 返回值類型 方法名(方法參數){ 方法體 }
函數的定義
需要放置在drl
文件中,並且是在規則文件的then
之後進行調用。
2、drl文件中如何調用java的靜態方法
- import 類的全限定名。
- 在
then
的部分使用類名.靜態方法名
四、實現
1、項目結構
2、引入drools依賴
<dependencyManagement> <dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-bom</artifactId> <type>pom</type> <version>7.69.0.Final</version> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-mvel</artifactId> </dependency> </dependencies>
一些不重要的依賴省略瞭,比如logback和lombok
。
3、編寫kmodule.xml文件
<kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="function-kabse" packages="rules" default="false"> <ksession name="function-ksession" default="false" type="stateful"/> </kbase> </kmodule>
4、編寫Person實體類
@Data @AllArgsConstructor public class Person { private String name; private Integer age; }
5、drl function編寫
6、編寫測試類
public class DroolsApplication { public static void main(String[] args) { KieServices kieServices = KieServices.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieSession kieSession = kieContainer.newKieSession("function-ksession"); kieSession.addEventListener(new DebugRuleRuntimeEventListener()); Person person = new Person("張三", 16); kieSession.insert(person); kieSession.fireAllRules(); kieSession.dispose(); } }
7、查看運行結果
到此我們的自定義function功能就完成瞭。
五、假設我想在when階段調用function
對於上面這個功能是可以實現的,但是需要借助eval
來實現,不過需要通過eval
來實現是不好的,而且性能也差。
舉例:
rule "rule_eval" when $person: Person() // eval 也可以調用java的靜態方法 eval(playGameOk($person)) then System.out.println("ok"); end
不推薦使用eval
參考鏈接:https://stackoverflow.com/questions/17487725/how-much-of-a-performance-hit-does-eval-cause-in-drools
六、完整代碼
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-function
七、參考鏈接
1、https://stackoverflow.com/questions/17487725/how-much-of-a-performance-hit-does-eval-cause-in-drools
2、https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#drl-functions-con_drl-rules
到此這篇關於drools中使用function的文章就介紹到這瞭,更多相關drools中使用function內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 深入淺析drools中Fact的equality modes
- 一文帶你學會規則引擎Drools的應用
- drools中query的用法小結
- 聊聊drools session的不同
- SpringBoot整合Drools規則引擎動態生成業務規則的實現