Drools规则引擎快速入门(一)_规则引擎drools简明教程-程序员宅基地

技术标签: 架构  后端  Drools规则引擎的入门到精通  

目录

一、Drools环境集成

二、drools规则引擎开发实现的具体步骤如下:

三、drools快速入门

 四、开发实现

第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包

第二步:根据drools要求在maven项目目录下创建 resources/META-INF/kmodule.xml

第三步:创建订单实体类Order

第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:

第五步:编写测试类TestDrools。


一、Drools环境集成

在项目中集成使用drools时,既可以独立使用也可以整合spring使用,如果是单独使用直接引入maven依赖包:如下

    <dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-spring</artifactId>
      <version>7.68.0.Final</version>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>7.68.0.Final</version>
    </dependency>

如果使用的开发工具是IDEA,那么在file->setting目录下

点击plugins插件市场中搜索安装drools插件 ,如图

二、drools规则引擎开发实现的具体步骤如下:

三、drools快速入门

业务场景描述

用户消费的金额对应赠送的积分规则情况如下:

//消费100元以下 不加分

//消费100元-500元 加100分

//消费500元-1000元 加500分

//消费1000元以上 加1000分

 四、开发实现

第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包

第二步:根据drools要求在maven项目目录下创建 resources/META-INF/kmodule.xml

需要有一个配置文件告诉代码规则文件drl在哪里,在drools中这个文件就是kmodule.xml

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

    <!--
    name:指定kbase的名称,可以任意,但是必须唯一
    packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
    default:指定当前kbase是否为默认
    -->
    <kbase name="SimpleRuleKBase" packages="rules">
        <!--
        name:指定ksession的名称,可以任意,但是必须唯一
        default:指定当前ksession是否为默认
        -->
        <ksession name="simpleRuleKSession"/>
    </kbase>
</kmodule>

注意:配置文件中的名称和位置都是固定写法,不能更改

Kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。

kbase需要一个唯一的name,可以取任意字符串。

packages为drl文件所在resource目录下的路径。注意分区drl文件中的package与此处的package不一定相同。多个包用逗号分隔,默认情况下会扫描resources目录下的所有(包含子目录)规则文件。

kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以直接查找到该KieBase,但每个module最多只能有一个默认的KieBase。

kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。

第三步:创建订单实体类Order

package com.hx.rules.entity;

import lombok.Data;

@Data
public class Order {

    /**
     * 订单金额
     */
    private int amount;

    /**
     * 积分
     */
    private int score;

    @Override
    public String toString() {
        return "Order{" +
                "amount=" + amount +
                ", score=" + score +
                '}';
    }
}

第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:

package rules;

import com.hx.rules.entity.Order;

//100元以下不加分
rule "score_1" //名称需唯一
when
$order:Order(amount < 100);
then
$order.setScore(0);
System.out.println("触发规则,100元以下不加分");
end

//100元-500元 加100分
rule "score_2"
when
$order:Order(100 < amount && amount< 500)
then
$order.setScore(100);
System.out.println("触发规则,100元-500元 加100分");
end
//500元-1000元 加500分
rule "score_3"
when
$order:Order(500 < amount && amount < 1000)
then
$order.setScore(500);
System.out.println("触发规则,500元-1000元 加500分");
end
//1000元以上 加1000分
rule "score_4"
when
$order:Order(1000 < amount)
then
$order.setScore(1000);
System.out.println("触发规则,500元-1000元 加500分");
end

第五步:编写测试类TestDrools。

情况一:module文件中kbase指定特定名称,并且default设置为true,测试类的代码如下:

package com.hx.rules;


import com.hx.rules.entity.Order;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class TestDrools {

    @Test
    public void test() {
        //第一步 获取KieServices
        KieServices kieServices = KieServices.Factory.get();
        //第二步获取kieContainer
        KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
        //第三步获取kieSession
        KieSession simpleRuleKSession = kieClasspathContainer.newKieSession();
        //新建事实对象
        Order order = new Order();
        order.setAmount(235);
        //第四步 插入事实对象到session中
        simpleRuleKSession.insert(order);
        //第五步 执行规则引擎
        simpleRuleKSession.fireAllRules();
        //第六步 关闭规则引擎
        simpleRuleKSession.dispose();
        System.out.println("规则执行完成,关闭规则");
    }
}

注意: 

KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //第三步获取kieSession KieSession simpleRuleKSession = kieClasspathContainer.newKieSession();

 两端代码中的container和kiesession无线指定name也能查找到KieBase

情况二:module文件中kbase指定特定名称,default未设置或者设置为false,测试类的代码如下:

package com.hx.rules;


import com.hx.rules.entity.Order;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class TestDrools {

    @Test
    public void test() {
        //第一步 获取KieServices
        KieServices kieServices = KieServices.Factory.get();
        //第二步获取kieContainer
        KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer("SimpleRuleKBase");
        //第三步获取kieSession
        KieSession simpleRuleKSession = kieClasspathContainer.newKieSession("simpleRuleKSession");
        //新建事实对象
        Order order = new Order();
        order.setAmount(235);
        //第四步 插入事实对象到session中
        simpleRuleKSession.insert(order);
        //第五步 执行规则引擎
        simpleRuleKSession.fireAllRules();
        //第六步 关闭规则引擎
        simpleRuleKSession.dispose();
        System.out.println("规则执行完成,关闭规则");
    }
}

测试代码中按照注解描述的步骤逐一编写,执行代码得出如下结果:

看到对应规则输出表示案例测试成功 

​​​​​​​Drools规则引擎快速入门(二)_爱编码阿信的博客-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/he_xin2009/article/details/124615188

智能推荐

NLTK 安装包 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。_nltk.download('wordnet')由于连接方在一段时间后没有正确答复或连接的主机没有反-程序员宅基地

文章浏览阅读3k次。在用NLTK做命名实体识别时,报错,提示有个包没找到。然后尝试安装这个包,结果还是不行:提示:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>在百度一些博客发现,需要去官方GitHub下载这个包https://github.com/nltk/nltk_data下载之后解压把packages里面的文件放到它搜索的路径下,随便放一个就行:我选择Anaconda3下,然后自己新建一个nltk_data文件夹:以为这次运行没啥问题了,结果还是_nltk.download('wordnet')由于连接方在一段时间后没有正确答复或连接的主机没有反

服务器配置(测试服务器)_模块已生成,不包含符号-程序员宅基地

文章浏览阅读1w次。一、连接服务器1.在如图所示的位置填写服务器地址,并选择"Release"、“x86”,然后点击“启动”在弹框中选择“继续调试”2.在/Socket_Test_Lesson/Socket_Test_01/bin/x86/Release中生成控制台的应用程序3.双击exe程序,弹出如图所示的弹框,这是因为写的是服务器地址,但是却在本机运行了_模块已生成,不包含符号

app适配不同机型的页面布局_手机型号不一致app页面怎么兼容-程序员宅基地

文章浏览阅读1.8k次。在app上,实现左右间隔宽度,同时适配不同机型,不会使页面布局出现混乱width:calc(100% - 10px);(这样实现左右间距各5px)可以通过加!important,强制覆盖原先的width:calc(100% - 10px)!important;..._手机型号不一致app页面怎么兼容

《黑科技》_黑科技 顾志强-程序员宅基地

文章浏览阅读1.7k次。【 随着医学领域的发展,人类活到一二百岁,甚至更长,并非遥不可及。】 未来的世界什么样?最前沿的科技会给人类生活带来哪些改变?它们的原理又是什么? 依靠克隆、干细胞等技术,人类可以修复受损的身体,开展器官移植;通过对长寿基因的研究,人们可以延年益寿;外骨骼能让人成为钢铁侠,而探测雷达能让你拥有 “火眼金睛”;机器的深度学习与 “天罗地网” 的结合,让人与世界以更奇妙的_黑科技 顾志强

未来的计算机能够神到什么程度,2019-2020年小学语文六年级《电子计算机与多媒体》2课时详细教学设计.doc...-程序员宅基地

文章浏览阅读67次。2019-2020年小学语文六年级《电子计算机与多媒体》2课时详细教学设计第一课时教学目标:1、学会本课的生字新词。2、引导学生联系课文内容理解词语。3、理清课文的脉络,整体感知课文的内容。教学过程:一、揭示课题。1、导语:同学们,随着科学技术的不断发展,在我们的生活中又走进了一位新朋友。他简直是无所不能,既能给我们的生活增添无穷的乐趣,又能在我们的学习生活中给与莫大的帮助与支持。你们知道这位时代..._未来的电子计算机会怎样“神”?

矩阵论——正交矩阵&Gram-Schimidt正交化_gram schimidt-程序员宅基地

文章浏览阅读735次。标准正交基:qiTqj={0if   i /=j1if   i=jq_i^Tq_j=\begin{cases}0&\text{if }\;i \mathrlap{\,/}{=}j\\1&\text{if }\;i=j\end{cases}qiT​qj​={01​if i/​=jif i=j​优点:1. 计算方便   2. 不会上溢,不会下溢   3.所有方程使用标准正交基后,都变得非常简单。对于标准正交列向量组成的矩阵Q=[q1,q2,._gram schimidt

随便推点

SpringMVC 拦截器HandlerInterceptorAdapter-程序员宅基地

文章浏览阅读186次。[code="java"] [/code][code="java"]import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import or..._handlerinterceptoradapter 拦截ws请求

Java游戏开发——连连看-程序员宅基地

文章浏览阅读420次。Linux编程点击右侧关注,免费入门到精通!来源java团长游戏介绍:“连连看”是一款来源于我国台湾的桌面小游戏,主要考验的是玩家们的眼力,在有限的时间内,只要能把所有能..._连连看游戏开发

yarn 和npm 换成淘宝镜像-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏2次。NPM设置淘宝镜像1.查询当前配置的镜像npm getregistry>https://registry.npmjs.org/设置成淘宝镜像npm config set registry http://registry.npm.taobao.org/2.换成原来的npm config setregistry https://registry.npmj...

iOS开发——搜索框(UISearchController)_ios 搜索框架-程序员宅基地

文章浏览阅读5.4k次。最近自己在写一个APP,其中需要实现搜索框搜索功能,于是乎就想写篇博客介绍下UISearchController和搜索框的实现。 我写的是一个天气预报APP,直接以我APP中的源代码来详细介绍下搜索框的实现。 注:在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBa_ios 搜索框架

《系统集成项目管理》第十六章 变更管理_项目计划变更管理流程 系统集成项目-程序员宅基地

文章浏览阅读6.2k次,点赞3次,收藏37次。文章目录一、项目变更的基本概念1、项目变更的概述2、项目变更的分类3、项目变更产生的原因二、变更管理的基本原则三、变更管理角色职责与工作程序1、角色职责2、工作程序一、项目变更的基本概念1、项目变更的概述项目变更:在信息系统项目的实施过程中,由于项目环境或者其他原因而对项目产品的功能、性能、架 构、技术指标、集成方法、项目的范围基准、进度基准和成本基准等方面做出的改变。变更管理的实质:根据项目推进过程中越来越丰富的项目认知,不断调整项目努力方向和资源配置,最大程度地满足客户等相关干系人的需求,提升项_项目计划变更管理流程 系统集成项目

用Arduino板为另一块Arduino烧写(更新)BootLoader_expected signature for atmega328p is 1e 95 0f-程序员宅基地

文章浏览阅读1w次,点赞14次,收藏34次。手上有两块几年前买的arduino nano板子,这两天要用的时候发现用arduino IDE 1.8.11烧写的时候始终报错“上传失败”。查阅相关资料发现应该在 IDE–工具–处理器 中选择ATmega238P(Old Bootloader)即可上传成功。这也侧面说明了我的板子的BootLoader已经旧了,不如顺便更新一下。_expected signature for atmega328p is 1e 95 0f

推荐文章

热门文章

相关标签