drools规则引擎环境搭建(代码片段)

joy99 joy99     2023-02-05     794

关键词:

一、关于 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

规则引擎drools介绍使用及springboot整合drools(代码片段)

规则引擎Drools介绍、使用及SpringBoot整合Drools一、Drools介绍1.1优点1.2架构1.2.1Drools引擎的核心组件1.2.2规则引擎工作流程简述1.3Drools语法1.3.1规则文件1.3.1.1.规则详情1.属性详情2.条件部分-LHS3.结果部分-RHS1.3.1.2Drools关键词1.3.1.3Drools... 查看详情

规则引擎drools6.4.0.final

java实现规则引擎:原理不多说,自己查阅资料吧;搭建环境:mavenspring(今天上图spring框架下搭建规则引擎);1:maven依赖;<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>$drools-vers 查看详情

规则引擎drools的使用(代码片段)

引入maven<dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.14.0.Final</version></dependency><dependency>& 查看详情

drools规则引擎入门指南(代码片段)

本篇博客主要讲解Drools常用的属性以及函数属性首先我们在resourcesules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTests1.salience优先级salience属性的值默认为0,它的值越大执行的优先级就越高,看如下代码在执行的时候... 查看详情

35activiti整合规则引擎drools(代码片段)

喜欢关注公众号:java乐园日常生活是由规则驱动的。红灯停绿灯行,这是我们的交通规则;我们站着往上跳,最终还是要落下来,这是地球的引力规则。规则在生活中无处不在。软件开发中我们也需要规则,满足什么规则应该... 查看详情

java规则引擎--drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。 本文所使用的demo已上传 http... 查看详情

规则引擎drools示例:个人所得税计算器信用卡申请保险产品准入规则(代码片段)

...一、Drools实战1.1个人所得税计算器1.1.1名词解释1.1.2计算规则1.1.3实现步骤1.2信用卡申请1.2.1计算规则1.2.2实现步骤1.3保险产品准入规则1.3.1决策表1.3.2规则介绍1.3.3实现步骤一、Drools实战1.1个人所得税计算器本小节我们需要通过Drool... 查看详情

drools规则引擎初探(代码片段)

...么Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。Rule是什么呢? 一条规则是对商业知识的编码。一条规则有 attributes ,一个 LeftHandSide&... 查看详情

规则引擎drools6.4.0.final

java实现规则引擎:原理不多说,自己查阅资料吧;搭建环境:mavenspring(今天上图spring框架下搭建规则引擎);1:maven依赖;<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>$drools-version</version></de... 查看详情

drools规则引擎中易混淆语法分析_循环触发导致死循环分析(代码片段)

...开发与测试阶段解决了,未波及到prod。首先看这样两条规则/***规则1_set默认利率*/rule"rate_default"no-looptruewhen$request:AmountRateRequest(calculateEnum==CalculateEnum.INTEREST||calculateEnum==CalculateEnu 查看详情

springboot2整合drools规则引擎,实现高效的业务规则

...这里一、Drools引擎简介1、基础简介Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。... 查看详情

drools整合springboot整合drools测试例子--个税计算器规则(代码片段)

规则引擎,主要作用,就是将规则与java代码分离,可通过修改规则实时生效。让非java程序员,只要熟悉业务,也可以写规则。规则引擎主要用在一些,打折、风控前置、后置、结算等模块地方。新建一个droolsdemo的maven工程。pom.... 查看详情

drools7hellowrold入门详细步骤--系列01课(代码片段)

一、什么叫规则引擎?规则---》写在文档上引擎---》在java代码上,引用这个文档上的规则二、drools规则引擎有什么用?简单来说就是将多变的规则,从业务代码中剥离出来(当规则变了之后,不用修改代码,而是修改一份文本... 查看详情

java开源的规则引擎drools电商行业实战(含完整代码)(代码片段)

...量是动态的,另外考虑到扩展性,满足将来业务规则的增长,不只是限制领取数需要新加其他条件,为了满足不断变化的业务场景,经分析后选用规则引擎Drools来实现。本场Chat通过一个电商行业的领取优惠券... 查看详情

googleaviator——轻量级java表达式引擎实战(代码片段)

...擎技术及比较Drools简介Drools(JBossRules)是一个开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。除了应用了Rete核心... 查看详情

drools简单应用(代码片段)

...事。  最近在对项目的积分模块进行改造的时候想到了规则引擎,使用规则引擎处理复杂而且多变的业务逻辑有其非常大的优势,包括实时更新、性能等方面。不多说,直接上代码:1、第一步先写好工具类,有了工具类,只... 查看详情

java规则引擎drools急速入门

文章目录​​1.Drools规则引擎简介​​​​2.DroolsAPI开发步骤​​​​3.SpringBoot整合Drools案例​​​​4.Drools基础语法​​​​5.Drools条件语法部分​​​​6.Drools结果操作部分​​​​7.Drools内置属性部分​​​​8.Drools高级语法... 查看详情

drools开源规则引擎比较难上手,有没有一款容易上手的规则引擎?

参考技术ADrools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。本文所使用的demo已上传htt... 查看详情