12、Drools决策表的定义6.4版本的应用及5.x版本的用法

重点看一下在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实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值