一、背景
當我們在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內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!