drools中使用function的方法小結(jié)
一、背景
當(dāng)我們?cè)?code>drools中編寫規(guī)則時(shí),有些時(shí)候存在重復(fù)的代碼,那么我們是否可以將這些重復(fù)代碼抽取出來,封裝成一個(gè)function
來調(diào)用呢?那么在drools
中如何自定義function
?
二、需求
1、當(dāng)我們的工作內(nèi)存中存在Person
對(duì)象時(shí),則需要調(diào)用drl function
來判斷用戶是否可以玩游戲。當(dāng)Person#age >= 18
時(shí)可以玩。
2、在then
后面調(diào)用java
的靜態(tài)方法
。
三、前置知識(shí)
1、function語法結(jié)構(gòu)
function 返回值類型 方法名(方法參數(shù)){ 方法體 }
函數(shù)的定義
需要放置在drl
文件中,并且是在規(guī)則文件的then
之后進(jìn)行調(diào)用。
2、drl文件中如何調(diào)用java的靜態(tài)方法
- import 類的全限定名。
- 在
then
的部分使用類名.靜態(tài)方法名
四、實(shí)現(xiàn)
1、項(xiàng)目結(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實(shí)體類
@Data @AllArgsConstructor public class Person { private String name; private Integer age; }
5、drl function編寫
6、編寫測(cè)試類
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、查看運(yùn)行結(jié)果
到此我們的自定義function功能就完成了。
五、假設(shè)我想在when階段調(diào)用function
對(duì)于上面這個(gè)功能是可以實(shí)現(xiàn)的,但是需要借助eval
來實(shí)現(xiàn),不過需要通過eval
來實(shí)現(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn)
這篇文章主要介紹了JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Mybatis步驟分解實(shí)現(xiàn)一個(gè)增刪改查程序
MybatisPlus是國(guó)產(chǎn)的第三方插件, 它封裝了許多常用的CURDapi,免去了我們寫mapper.xml的重復(fù)勞動(dòng)。本文將整合MybatisPlus實(shí)現(xiàn)增刪改查功能,感興趣的可以了解一下2022-05-05Mybatis批量插入index out of range錯(cuò)誤的解決(較偏的錯(cuò)誤)
這篇文章主要介紹了Mybatis批量插入index out of range錯(cuò)誤的解決(較偏的錯(cuò)誤),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring定時(shí)任務(wù)實(shí)現(xiàn)與配置(一)
這篇文章主要為大家詳細(xì)介紹了Spring定時(shí)任務(wù)的實(shí)現(xiàn)與配置第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06mybatis不加@Parm注解報(bào)錯(cuò)的解決方案
這篇文章主要介紹了mybatis不加@Parm注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11