G. B.

个人博客

且将新火试新茶,诗酒趁年华


本地使用Maven构建Drools项目

DROOLS (JBOSS RULES)为java语言开发的开源业务规则引擎,具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。下面介绍如何使用IDEA来构建一个基于Maven的Drools项目。

① 首先新建一个使用maven-archetype-quickstart架构的项目,注意java版本一定要小于等于15

② Name与ArtifactId为项目名称

注意这里的GroupId,它会变成项目建成后架构中该路径下的package名,斟酌填写

③ 打开项目根目录下的pom.xml文件,为项目添加maven依赖包,点击Alt+Insert会有如下弹窗

依次添加下列依赖包:

  • org.drools:drools-core:7.45.0.Final
  • org.drools:drools-compiler:7.45.0.Final
  • org.drools:drools-templates:7.45.0.Final
  • org.drools:drools-decisiontables:7.45.0.Final
  • org.slf4j:slf4j-api:1.7.26
  • org.slf4j:slf4j-log4j12:1.7.31
  • junit:junit:4.13.2
  • com.alibaba:fastjson:1.2.75
  • com.cedarsoftware:json-io:4.12.0

④ 新建文件将项目补全至如下架构

其中kmodule.xml中内容为:

<?xml version="1.0" encoding="UTF-8"?>

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="org.example">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>

rule.xls文件所在目录下为策略文件放置处,策略文件可以为xls文件,也可以为drl文件

⑤ 其中Demo.java文件为drools策略进行判断时使用的字段来自的类,我们这里填写一个示例

package org.example;

public class Demo implements java.io.Serializable {
    private String x;
    private Integer y;

    public Demo() {
    }

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }

    public Integer getY() {
        return y;
    }

    public void setY(Integer y) {
        this.y = y;
    }

    public Demo(String x, Integer y)
    {
        this.x = x;
        this.y = y;
    }
}

⑥ 修改App.java文件内容,让drools项目可以在本地运行起来

package org.example;

import com.alibaba.fastjson.JSONObject;
import com.cedarsoftware.util.io.JsonWriter;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.drools.decisiontable.SpreadsheetCompiler;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class App {
    public static void runDrl() {
        BasicConfigurator.configure();
        Logger.getRootLogger().setLevel(Level.OFF);
        // 从工厂中获得KieServices实例
        KieServices kieServices = KieServices.Factory.get();
        // 从KieServices中获得KieContainer实例,其会加载kmodule.xml文件并load规则文件
        KieContainer kieContainer = kieServices.getKieClasspathContainer();
        // 建立KieSession到规则文件的通信管道
        KieSession kSession = kieContainer.newKieSession("ksession-rules");

        // 构建实体类对象
        Demo demo = new Demo();
        demo.setX("123");
        demo.setY(123);

        kSession.insert(demo);
        int count = kSession.fireAllRules();
        System.out.println("总共触发了: " + count + " 条规则");
        System.out.println(JsonWriter.formatJson(JSONObject.toJSON(demo).toString()));
    }

    public static void convertExcelToDrl() {
        SpreadsheetCompiler compiler = new SpreadsheetCompiler();
        // 最后一个参数是excel里 sheet 的名称
        String rules = compiler.compile(ResourceFactory.newClassPathResource("org.example" + File.separator + "rule.xls", "UTF-8"), "Sheet1");

        try {
            BufferedWriter out = new BufferedWriter(new FileWriter("src/main/resources/org.example/rule-excel.drl"));
            out.write(rules);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//        convertExcelToDrl();
        runDrl();
    }
}

运行结束时程序会打印出共触发了哪些规则,并且将经drools决策修改后的Demo类中所有属性使用json的格式打印在屏幕上。注意到其中还有一个未使用的静态方法convertExcelToDrl,它的作用是当我们使用xls决策表时,单独运行该方法可以将决策表翻译并生成一个rule-excel.drl文件。但需要明确的是,直接运行runDrl方法程序将直接从决策表中读取规则,无需手动先将其翻译为drl文件。

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦