drools中使用function的方法小結(jié)
一、背景
當我們在drools
中編寫規(guī)則時,有些時候存在重復(fù)的代碼,那么我們是否可以將這些重復(fù)代碼抽取出來,封裝成一個function
來調(diào)用呢?那么在drools
中如何自定義function
?
二、需求
1、當我們的工作內(nèi)存中存在Person
對象時,則需要調(diào)用drl function
來判斷用戶是否可以玩游戲。當Person#age >= 18
時可以玩。
2、在then
后面調(diào)用java
的靜態(tài)方法
。
三、前置知識
1、function語法結(jié)構(gòu)
function 返回值類型 方法名(方法參數(shù)){ 方法體 }
函數(shù)的定義
需要放置在drl
文件中,并且是在規(guī)則文件的then
之后進行調(diào)用。
2、drl文件中如何調(diào)用java的靜態(tài)方法
- import 類的全限定名。
- 在
then
的部分使用類名.靜態(tài)方法名
四、實現(xiàn)
1、項目結(jié)構(gòu)
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、查看運行結(jié)果
到此我們的自定義function功能就完成了。
五、假設(shè)我想在when階段調(diào)用function
對于上面這個功能是可以實現(xiàn)的,但是需要借助eval
來實現(xiàn),不過需要通過eval
來實現(xiàn)是不好的,而且性能也差。
舉例:
rule "rule_eval" when $person: Person() // eval 也可以調(diào)用java的靜態(tài)方法 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
到此這篇關(guān)于drools中使用function的文章就介紹到這了,更多相關(guān)drools中使用function內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis批量插入index out of range錯誤的解決(較偏的錯誤)
這篇文章主要介紹了Mybatis批量插入index out of range錯誤的解決(較偏的錯誤),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12