第一步,项目中引入maven依赖
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.6.0.Final</version>
</dependency>
</dependencies>
第二步,新建规则文件
新建一个文件后缀为drl格式文件,如:test.drl
其中文件各个模块说明如下:
文件各部分说明
<1>、package 主要是定义一个包名
<2>、import 主要是引入需要用到的类
<3>、dialect ‘java’ 默认固定值
<4> 、rule体说明
rule 是打头,‘man’ 是一个规则的名字,后面Java代码里面可以根据名字来执行某一个规则
when 规则里面的条件判断,相当于Java里面的if()条件判断。
上面两行写法也可以写成一行: $map:Map(this["status"]=="0");
Map() 指的是Java传过来的数据对象是一个map对象,()表示里面要过滤条件。$map这个变量来接收传过来的值。
then 就是根据条件判断之后要什么样的结果,里面可以往对象里面设值、也可以执行业务方法。
如:匹配上这个规则之后,给这个map对象重新put一个值,如上。在Java执行完这个规则文件之后就可以取到这个值。
<5>、drl文件的注释,跟Java代码的注释写法一样,用//或者/***/单行或者多行注释。
第三步,Java后端说明
KieServices:接口,可以访问所有的创建和运行时对象。
KieContainer: 装载与引擎相关的组件,通过KieServices.Factory.get()方式获得,为其他Kie工具提供服务。KieContainer可以通过ReleaseId,Artifact,Version参数获得另外一个KieContainer。
KieSession:在Drools中,KIE会话存储并执行运行时数据。
Drools有工具类,可以KieHelper类,可以用来创建容器。
- 创建KieHelper对象
KieHelper helper = new KieHelper();
- 读取规则文件、把规则加进去 String rule = new String(Files.readAllBytes(Paths.get(path)),Charset.defaultCharset()); // 读取规则文件并转成字符串加载到content中去 helper.addContent(rule, ResourceType.DRL);
- 获取规则引擎容器
- KieContainer kieContainer = helper.getKieContainer();
KieSession kSession = kieContainer.newKieSession();
获取规则引擎容器,然后创建会话,后续数据操作都是用会话来操作的。
- 规则引擎传入数据参数
kSession.insert(dataMap);
// 数据添加进去
kSession.fireAllRules();
// 执行所有规则
kSession.dispose();
// 输出
dataMap就是你要传入到规则引擎里面的数据。
注意:如果要传入多个对象,就写多个kSession.insert()。
但是如果是多个相同的对象,比如说:两个map对象,map1,map2
传过去,drl规则文件接收时候就区分不出来接收是哪个,所以这里建议用global传值。
第四,global用法
第一种:在KieSession设置全局变量
第一步:
kSession.setGlobal("map1", dataMap);
kSession.setGlobal("map2", dataMap);
第二步:在drl规则文件里取值
在下面直接用map1就可以取值,赋值了
第二种:在KieSession设置类或者service
第一步:
kSession.setGlobal("testDrlService", testDrlService);
如果方法是静态方法,后面的值就直接放类点class或者new一个对象;
如果方法非静态,可以用@autowide把service注解进来,放进去。
第二步:
在drl文件中调用服务实例
可以调用更新方法直接更新数据库数据。
第五、 函数用法
在drl文件中也可以像js中写函数一样,直接写函数,位置放在import下面即可。
在rule里面需要调用的话,直接用,如:
drlPrint(“测试函数1111111”);
第六、 其他扩展说明
- 对规则指定分组,可以只执行某一个组下面的规则,下面只执行base组下面的规则
kSession.getAgenda().getAgendaGroup("base").setFocus();
- 对规则名过滤,只执行某个规则名下面的规则
kSession.fireAllRules(new RuleNameEqualsAgendaFilter("man"))
list数据取值
List数据可以用 对象 from 列表,这样就是循环执行,如上:
上面规则说明:可以根据条件来判断只执行输出那条结果,比如说工资大于10000,执行a输出结果,小于执行b输出结果,但是最后都需要执行then里面的。
也可以
循环取list