侧边栏壁纸
  • 累计撰写 106 篇文章
  • 累计创建 3 个标签
  • 累计收到 19 条评论
标签搜索

目 录CONTENT

文章目录

Drools入门之决策表

卑微幻想家
2022-07-22 / 0 评论 / 0 点赞 / 58 阅读 / 1,794 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

决策表是规则文件的一种变形,是以xls/xlsx为扩展名的文件,是指通过Excel完成对规则的匹配。它是一种“精确而紧凑”的条件逻辑方式,非常适合业务场景规则。决策表并非新的技术概念(在软件术语中),其应用领域非常广泛,已经有很多企业在使用,通过实践证明决策表在某些应用中是可行的。

通俗地讲,决策表就是向电子表格中输入特定的值,并加载到Drools规则库的一种数据驱动的规则方法。

要使用决策表,首先需要引入依赖

<dependency>
     <groupId>org.drools</groupId>
     <artifactId>drools-decisiontables</artifactId>
     <version>7.10.0.Final</version>
</dependency>

修改kmodule.xml配置文件,并添加如下配置:

<kbase name="xls" packages="rules.isXls">
    <ksession name="testXls"/>
</kbase>

在测试类中新建测试方法

@Test
    public void testXls() {
        KieServices kieService = KieServices.Factory.get();
        KieContainer kieContainer = kieService.getKieClasspathContainer();
        KieSession kieSession = kieContainer.newKieSession("testXls");

        kieSession.fireAllRules();
        kieSession.dispose();
    }

新建excel,格式如下:

image-20220720153009125

决策表占位符

决策表中有一个很重要的功能—占位符,占位符功能分为两种形式:$param$1$2…。决策表是Excel,而Excel是由单元格组成的,每一个单元格是Excel的最小单位,而$param占位符的作用是获取每一个单元格的内容。

决策表关键字

image-20220722154514459

image-20220722154611950

决策表中有详细的说明,规则以RuleSet为开始,也就是说通过RuleSet来判断决策表是从哪里开始的,而且在RuleSet中可以添加注释

image-20220722154724058

调用决策表的另一种方式

调用决策表的另一种方式是通过Drools工具类KieHelper。

@Test
public void testKieHelper() {
    Resource dis =
ResourceFactory.newClassPathResource("rulesTwo/isXls/tableXls.xls",
RulesTable.class);
    KieHelper helper = new KieHelper();
    helper.addResource(dis, ResourceType.DTABLE);
    KieSession ksession = helper.build().newKieSession();
    int i = ksession.fireAllRules();
    System.out.println( "     " + i + "次");
    ksession.dispose();
}

单元格合并

image-20220722155319896

A8 表示:A-C的条件都均受Person的约束

B8、B9表示:都是同样的条件值合并了而已

将决策表转换为drl

@Test
    public void verificationDT() throws FileNotFoundException {
        File file = new File("D:\\IDEAWorkSpace\\drools\\src\\main\\resources\\rules\\isXls\\tableXls.xls");

        InputStream is = new FileInputStream(file);

        SpreadsheetCompiler converter = new SpreadsheetCompiler();
        String drl = converter.compile(is, InputType.XLS);

        System.out.println(drl);
    }
0

评论区