Drools 规则引擎环境搭建

一、关于 drools 规则引擎

前面写过一篇 Drools 规则引擎相关的文章,这篇文章主要记录一下规则引擎的环境搭建和简单示例。不熟悉 drools 的朋友可以看看这篇文章: 自己写个 Drools 文件语法检查工具——栈的应用之编译器检测语法错误
介绍的内容:

  • Drools 规则引擎的使用场景
  • Drools 规则引擎的优点
  • Drools的基本工作工程(Fact对象、Drl文件内容、Drools的基础语法)
  • drools 文件的形式
  • Drools 文件语法初步检查

二 、Drools 的环境搭建及简单示例

环境: idea + jdk1.8 + gradle
我用的是 gradle 构建 java 工程的方式、用 maven 构建的可以参考配置

构造这样一个需求背景,双十一来了,商品打折,假设商品价格 (0,500], 打85折,商品价格 (500, 1000],打8折, 商品价格 (1000,∞), 一律减 300。

1. 创建项目

新建一个 gradle 项目,创建包:com.sharpcj,新建类 Product.javaMain.java

Product.java 文件如下:

package com.sharpcj;

public class Product {
    private String name;  // 商品名称
    private double prePrice;  // 商品定价
    private double realPrice;  //商品实际售价

    public Product() {
    }

    public Product(String name, double prePrice) {
        this.name = name;
        this.prePrice = prePrice;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrePrice() {
        return prePrice;
    }

    public void setPrePrice(double prePrice) {
        this.prePrice = prePrice;
    }

    public double getRealPrice() {
        return realPrice;
    }

    public void setRealPrice(double realPrice) {
        this.realPrice = realPrice;
    }
}

然后在 Main.java 新建 main 方法。

2. Gradle引入Drools库

打开 build.gradle 文件,添加相应的插件和依赖


plugins {
    id ‘java‘
}

plugins {
    id ‘application‘
}

mainClassName = ‘com.sharpcj.Main‘

group ‘com.sharpcj‘
version ‘1.0-SNAPSHOT‘

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.12‘
    compile group: ‘org.kie‘, name: ‘kie-api‘, version: ‘7.5.0.Final‘
    compile group: ‘org.drools‘, name: ‘drools-compiler‘, version: ‘7.5.0.Final‘
}

引入 Java 插件,使Gradle可以构建Java代码,同时引入了执行Drools依赖的两个库, 指定了 mainClassName

3.编写 drools 文件

resources 目录下面新建包 demo.rules,用来存放 drools 规则文件。然后新建文件 product.drl

内容如下:

package com.sharpcj;

rule "Product price less than 500" // 给规则取个名
when
    pp : Product( prePrice <= 500 ) // 规则
then
    // 符合规则后执行的操作,是Java代码
    double prePrice = pp.getPrePrice();
    pp.setRealPrice(prePrice * 0.85);
    System.out.println(pp.getName() + "活动价是:" + pp.getRealPrice());
end

rule "Product price less than 1000" // 给规则取个名
when
    p : Product( prePrice > 500 && prePrice <=1000 ) // 规则
then
    // 符合规则后执行的操作,是Java代码
    double prePrice = p.getPrePrice();
    p.setRealPrice(prePrice * 0.8);
    System.out.println(p.getName() + "活动价是:" + p.getRealPrice());
end

rule "Product price more than 1000" // 给规则取个名
when
    p : Product( prePrice > 1000 ) // 规则
then
    // 符合规则后执行的操作,是Java代码
    double prePrice = p.getPrePrice();
    p.setRealPrice(prePrice - 300);
    System.out.println(p.getName() + "活动价是:" + p.getRealPrice());
end

4.编写配置文件

运行 drools 需要一个固定的配置文件,在 resources 文件下的目录 META_INF,名称固定为 kmodule.xml

配置文件至少包含如下几行:

<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="kbase1" packages="demo.rules">
        <ksession name="ksession1" />
    </kbase>
</kmodule>

配置简单说明:

  • Kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。
  • Kbase需要一个唯一的name,可以取任意字符串。
  • packages为drl文件所在resource目录下的路径。注意区分drl文件中的package与此处的package不一定相同。
  • 多个包用逗号分隔。默认情况下会扫描resources目录下所有(包含子目录)规则文件。
  • kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以查找到该KieBase,但每个module最多只能有一个默认KieBase。
  • kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。

5.让规则文件程序跑起来

Main.java 类中编写测试方法,让规则文件跑起来:

package com.sharpcj;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class Main {
    public static void main(String[] args){
        new Main().test();
    }

    private void test(){
        // 构建KieServices
        KieServices ks = KieServices.Factory.get();
        KieContainer kc = ks.getKieClasspathContainer();
        // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
        KieSession kSession = kc.newKieSession("ksession1");

        Product fan = new Product("电扇", 280);
        Product washer = new Product("洗衣机",2200);
        Product phone = new Product("手机", 998);
        kSession.insert(fan);
        kSession.insert(washer);
        kSession.insert(phone);
        kSession.fireAllRules();
        kSession.dispose();
    }
}

运行结果:

三、其它说明

1.不使用配置文件形式

上面使用的配置文件形式加载 drools 文件是 drools 7.x 版本才有的,在此之前,我们通常使用代码形式加载规则文件,当然在 drools 7.x 中依然可以使用这种方式,只不过有些 API 已经过时了,或者更新了。下面用代码形式加载规则文件代码如下:

    /**
     * 不使用 drools 7.x 配置文件
     */
    private void test2(){
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("demo/rules/product.drl"), ResourceType.DRL);

        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }

        // 注释掉的是 drools 6.x API
        /*KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();*/

        // drools 7.x API
        InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        Collection<KiePackage> pkgs = kbuilder.getKnowledgePackages();
        kbase.addPackages(pkgs);
        KieSession kieSession = kbase.newKieSession();
        Product fan = new Product("电扇", 280);
        Product washer = new Product("洗衣机",2200);
        Product phone = new Product("手机", 998);
        kieSession.insert(fan);
        kieSession.insert(washer);
        kieSession.insert(phone);
        kieSession.fireAllRules();
        kieSession.dispose();
    }

运行程序依然能得到相同的结果。

2.规则文件的类型

规则文件除了 drl 文件之类,还有其它类型的文件,如 xls, csv。

四、附录

Drools 官网首页: https://www.drools.org/
Drools 官方文档: https://docs.jboss.org/drools/release/7.12.0.Final/drools-docs/html_single/index.html

原文地址:https://www.cnblogs.com/joy99/p/10134893.html

时间: 2024-10-07 13:14:42

Drools 规则引擎环境搭建的相关文章

eclipse下搭建Drools规则引擎环境

插件下载地址:http://download.jboss.org/drools/release/ 1.点开对应的版本文件,选择标红的两个压缩包下载,其他的如有需要也可以自行选择: 2.将下载的压缩包解压,这边放到了E:\tools\drools目录下,打开eclipse,Help->Install New SoftWare->add,选择 E:/tools/drools/droolsjbpm-tools-distribution-5.6.0.Final/binaries/org.drools.

Drools6.1规则引擎环境搭建

1.Drools官方网站下载Drools安装包, 官网链接:http://drools.org/download/download.html 下载安装包后,解压放到任意盘(比如D盘),解压之后该目录下包含如下的子目录: 其中: binaries: 存放所依赖的第三方jar包和Drools编译后的jar包. examples:Drools项目自带的例子. javadoc:Drools的Java API文档. osgi-binaries: ? reference_manual:Drools的用户文档

drools规则引擎因为内存泄露导致的内存溢出

进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问题有以下几个方面: 1) 当业务规则变更时,对应的代码也得跟着更改,每次即使是小的变更都需要经历开发.测试验证上线等过程,变更成本比较大. 2) 长时间系统变得越来越难以维护. 3) 开发团队一般是由一个熟悉业务的BA(业务分析人员)和若干个熟悉技术的开发人员组成,开发人员对业务规则的把握能力远不及

SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效.具有易于访问企业策略.易于调整以及易于管理的特点,作为开源业务规则引擎,符合业内标准,速度快.效率高. 2.规则语法 (1).演示drl文件格式 package droolRule ; import org.slf4j.

Drools规则引擎初窥---drl和决策表实现[实例]

因项目需要,看了下drools规则引擎.写了一个比较简单的drools的drl规则和决策表实现的例子. 规则说明: 网络商城要举办活动(奖励额外积分), 订单原价金额在 100以下, 不加分 100-500 加100分 500-1000 加500分 1000 以上 加1000分 1.建立最基本的Drools项目结构并引入必须的类库.(这里采用junit来执行单元测试).创建一个Java Project,建立maven形式的源码包. 2.定义实体类Order.java 1 import java.

drools规则引擎初探

1.drools是什么 Drools是为Java量身定制的基于Charles  Forgy的RETE算法的规则引擎的实现.具有了OO接口的RETE,使得商业规则有了更自然的表达. Rule是什么呢? 一条规则是对商业知识的编码.一条规则有 attributes ,一个 Left Hand Side ( LHS )和一个 Right Hand Side ( RHS ).Drools 允许下列几种 attributes : salience , agenda-group , no-loop , au

Spring Boot+Drools规则引擎整合

目的 官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少. 本文介绍如何在Spring Boot项目上加上Drools规则引擎. POM依赖 POM文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

Drools规则引擎-如果判断某个对象中的集合是否包含指定的值

规则引擎集合相关处理 在实际生产过程中,有很多关于集合的处理场景,比如一个Fact对象中包含有一个集合,而需要判断该集合是否包含某个值.而Drools规则引擎也提供了多种处理方式,比如通过from.contains.exists等进行操作,比较. 当然也可以通过function函数来做相应的比较,在个在其他章节讲到过,就不在此赘述.下面重点以几个实例才进行讲解,在具体实践中根据具体情况来进行运用. 实例 省略掉基本的配置,直接看调用代码和规则代码. 测试调用代码: public class Co

Drools 规则引擎 BRMS

安装说明 | Drools中文网 http://www.drools.org.cn/category/install Drools规则引擎-在微服务中的应用 - 简书 https://www.jianshu.com/p/887ff9021eb3 Drools规则引擎-在微服务中的应用 - 简书 https://www.jianshu.com/p/887ff9021eb3 微服务组件-规则引擎 - Fx_demon - OSCHINA https://my.oschina.net/fxdemon/