重点看一下在6.4版本中是如何去使用的。
其实用法与drl是一样的。在kmodule.xml 中定义 决策表的具体package的地址与RuleSet中要与package名字相同,且实际目录也要保持一致
具体的java代码与执行drl一样,所以这里就不再多说了 spring中如何使用6.4版本的决策表呢,其实和drl也是一样的 请看之前的章节 有说明
Drools决策表的两种执行方法,第一种:通过api方式,第二种:通过Spring注入,
下面我们说明一下两种方法的写法:
注:以下代码均为5.x版本的写法,至于6.4版本 调用方式与DRL的使用是一样的,
第一种:通过原生的api实现
下面我们通过代码来说明
public static void execlDirectTest() {
DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory .newDecisionTableConfiguration();
dtableconfiguration.setInputType(DecisionTableInputType.XLS);//枚举 表示执行的是xls,当然还有一种csv的
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder();
kbuilder.add(ResourceFactory //add方法 *添加一个给定的资源类型的资源,使用ResourceConfiguration提供
.newClassPathResource("rules/RuleInExcel.xls", //找到指定目录的xls文件,
RuleInExcelTest.class), //当前类
ResourceType.DTABLE, dtableconfiguration); //xls的标识
KnowledgeBase kbase= KnowledgeBaseFactory.newKnowledgeBase();//获取base实现方法
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); //将集合添加到KnowledgeBase中
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();//通过base获取 kession 实现
ksession.fireAllRules();// 执行 规则引擎
ksession.dispose();//关闭规则引擎 释放当前会话的所有资源,设置垃圾收集的会话
}
xls的路径
xls的内容
$param 表示占位符, 如果有区间 就可以用$1,$2
CONDITION 下两行是编辑条件的,注:第一行一般定义 fact引用 如:$p:Person(), 在第二行就可以直接写在name==$param
CONDITION 下第一行不为空,则从第一行条件开始为条件,第二行依赖第一行,如果第一行为空,则从第二行开始为条件
CONDITION 下第三行为注释行,即该行不能做为数据进行传输,转成drl 从规则名就能看的出来 规则名是由行号为后缀的
CONDITION 与ACTION 不能交叉写
注释行下 第一行为一个规则 如上图所示 这里 有4个规则
引用的类
第二种通过Spring 注入
java 实现
public static void execlSpringTest() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("drools/spring-drools.xml");
//xml 中bean 的id
StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) context.getBean( "ksession-excel" );
ksession.fireAllRules();
ksession.dispose();
}
xml 写法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:drools="http://drools.org/schema/drools-spring"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://drools.org/schema/drools-spring
http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-container/drools-spring/src/main/resources/org/drools/container/spring/drools-spring-1.0.0.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<drools:kbase id="kbase-excel">
<drools:resources>
<drools:resource type="DTABLE" source="classpath:rules/RuleInExcel.xls" /><!-- xls 路径-->
</drools:resources>
</drools:kbase>
<drools:ksession id="ksession-excel" type="stateful" kbase="kbase-excel" /><!-- 允许迭代, 缓存 , 如果没有 就是一性次执行-->
</beans>
语法说明:6.4与5.x的语法是一样的
用于规则表之前的关键字
关键字 | 说明 | 是否必须 |
RuelSet
|
在这个单元的右边单元中包含
ruleset的名称 和drl文件中的package 是一样
|
必须,只能有一个(如果为空则使用默认值)
|
Sequential
|
右边的单元可以是true或false,如果是true则确保规则按照从表格的上面到下面的顺序执行
(
规则触发是从上朝下,如果是false就是乱序
)
|
可选
|
Import
|
要导入规则库中的类的列表
(
逗号隔开
)
|
可选
|
Functions
|
紧接右边的单元格可以包含函数,其可用于规则的片断中。Drools
支持在 DRL 中定义函数,允许逻辑被嵌入在规则中,不用硬代码改
变,小心使用。语法与标准 DRL 相同。
有返回值与无返回值两种
如果要定义多个函数,就在Functions后面 以逗号作为分隔符 定义多个函数
|
可选
|
Variables
|
紧跟在右边的单元格包含global声明。格式是类型跟着变量名(
全局变量定义,多个用逗号隔开
)与drl中的 global 一个意思
|
可选
|
Queries
|
紧接右边的单元格可以包含 Drools 支持的全局声明。它一个类型,
紧跟着一个查询名字(如果需要多个查询,用逗号分隔它们) 与drl中的query 是一个意思
| 可选 |
RuleTable
|
这个的意思是表示规则名,写法是 在RuleTable后直接写规则名的前缀,不用另写一列
|
必添
|
规则表关键字
关键字 | 说明 | 是否必须 |
CONDITION
|
指明该列将被用于规则条件
CONDITION (代表条件) 相当于drl中的when
|
每个规则
表至少一
个
|
ACTION
|
指明该列将被用于推论,简单理解为结果 相当于drl中r then
ACTION 与CONDITION 是平行的
|
每个规则
表至少一
个
|
PRIORITY
|
指明该列的值将被设置为该规则行的'salience'值。
覆盖'Sequential'标志。但注意,如果在ruleSet下设置了 sequential 的值为true
则 PRIORITY 不起作用, 如果 sequential 设置为false 或者不设置 则PRIORITY 生效
书写规范 与规则行平行 值 为数值型,
| 可选 |
DURATION
|
指明该列的值将被设置为该规则行的期限(duration )值 延迟作用和drl中的duration是一个意思
|
可选
|
NAME
|
指明该列的值将被设置为从那行产生的规则的名字。
|
可选
|
NO-LOOP
|
指明这个规则不允许循环。为了这个选项正常运行,这里在该
单元格中必须是让该选项生效的一个值(true 或 false)。如果
该单元格保持为空,那么这个选项将不会为该行设置
|
可选
|
ACTIVATION-GROUP
|
在这个列中的单元格的值,指出该规则行属于特定的 XOR/活
动组。 一个活动组意味着在那个命名组中的规则只有一条会被
引发。(即,首条规则引发,中止其他规则活动)。与drl中的含义是一样的
|
可选
|
AGENDA-GROUP
|
在这个列中的单元格的值, 指出着该规则行属于特定的议程组 可以理解成获取焦点
(这是一种在规则组之间的控制流的方法
)。
|
可选
|
RULEFLOW-GROUP
|
在这个列中的单元格的值, 指出着该规则行属于特定的规则流
组。
|
可选
|
那我们如何知道 我们的决策表是否正确呢,下面有一个检验方法,反编译决策表
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class TestXLS {
@Test
public void tests() throws FileNotFoundException {
File file = new File(
"C:\\Users\\kangz\\Desktop\\simple_test.xlsx");
InputStream is = new FileInputStream(file);
SpreadsheetCompiler converter = new SpreadsheetCompiler();
String drl = converter.compile(is, InputType.XLS);
System.out.println(drl); //返回为drl的内容
}
}
在决策表中要注意:如果要引用子父级关系比较的话。是用到from 来进行表达
oa表示父级类,ob表示子级类
oa:Oa();
ob:Ob from oa.getOb();
例如:学校是人的一个属性,学校是一个javabean 人也是一个javabean
p:Person();
s:School from p.getSchool();
这就可以通过 "s" 引用子类中的属性了
还有一种写法:
p:Person(name=="***", school.name=="一班");
这样的写法也是可以的,只是在别的地方不能引用school。.
下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的
----请看下方↓↓↓↓↓↓↓
百度搜索 Drools从入门到精通:可下载开源全套Drools教程
深度Drools教程不段更新中:
更多Drools实战陆续发布中………
扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓