【Drools】Drools使用入门(一)Drools上手教程(包括动态加载规则文件)
Drools简介
Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。
规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释业务规则,以及基于业务规则做出业务决策,从而提供极大的编程便利。
对系统使用人员来说:
- 将业务规则的创建、修改、维护透明话;
- 提高业务灵活度;
- 减少对开发人员的依赖;
- 避免业务升级带来的风险;
对开发人员来说:
- 增加代码灵活性;
- 降低系统维护成本,提高系统可维护性;
- 解耦业务与规则,减少代码修改成本;
- 简化系统架构,优化应用结构;
引入规则引擎前后程序架构:
引入前:
引入后:
idea 搭建 Drools 开发环境
- 安装Drools idea插件
idea界面一次选择:File => Settings => Plugins => 搜索Drools =>安装JBoss Drools support
- 引入依赖
导入Drools依赖时顺便导入SpringBoot Test的依赖,方便接下来的测试,除了上述两个依赖外还需要引入kie-api的依赖,因为Drools基于Kie概念的API,对之前版本繁琐的规则引擎调用方式进行了优化。
<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.23.0.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.drools/drools-compiler --><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.23.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>7.23.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.23.0.Final</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>7.23.0.Final</version></dependency><!--springboot程序测试依赖,如果是自动创建项目默认添加--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
- 配置kmodule文件
在resources下创建META-INF文件夹,并且创建文件kmodule.xml,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="rules"><ksession name="all-rules"/></kbase>
</kmodule>
文件各项配置的作用会在接下来的文章中提及。
Drools简单示例(包括动态加载配置文件)
- 创建规则操作数据对象
package com.asiainfo.bean;/*** Title Person* Package com.asiainfo.bean* Description Person类* Author 唐磊* Date 2019-07-06 14:25*/
public class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
- 创建规则文件drl
在resources下创建rules文件夹,并创建规则文件。
代码如下:
import com.asiainfo.bean.Persondialect "mvel"rule "age"when$person : Person(age<16 || age>50)thenSystem.out.println("这个人的年龄不符合要求!(基于规则文件)");
end
规则文件具体语法会在接下来的文章中提及。
- 测试(基于规则文件的)
代码:
import com.asiainfo.Application;
import com.asiainfo.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.KieServices;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** Title TestDrools* Package* Description 测试Drools类* Author 唐磊* Date 2019-07-06 14:26*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
public class TestDrools {private static KieContainer container = null;private KieSession statefulKieSession = null;/*** Title test* Param []* Return void* Exception* Description 基于配置文件* Author 唐磊* Date 2019-07-06 14:27*/@Testpublic void test() {KieServices kieServices = KieServices.Factory.get();container = kieServices.getKieClasspathContainer();statefulKieSession = container.newKieSession("all-rules");Person person = new Person();person.setAge(12);person.setName("Test");statefulKieSession.insert(person);statefulKieSession.fireAllRules();statefulKieSession.dispose();}
}
测试结果:
输出 这个人的年龄不符合要求!(基于规则文件)
4. 测试动态加载规则(基于字符串)
代码:
import com.asiainfo.Application;
import com.asiainfo.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.KieServices;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** Title TestDrools* Package* Description 测试Drools类* Author 唐磊* Date 2019-07-06 14:26*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
public class TestDrools {private static KieContainer container = null;private KieSession statefulKieSession = null;/*** Title ruleStringTest* Param []* Return void* Exception* Description 基于字符串* Author 唐磊* Date 2019-07-06 14:27*/@Testpublic void ruleStringTest() throws Exception {String myRule = "import com.asiainfo.bean.Person\n" +"\n" +"dialect \"mvel\"\n" +"\n" +"rule \"age\"\n" +" when\n" +" $person : Person(age<16 || age>50)\n" +" then\n" +" System.out.println(\"这个人的年龄不符合要求!(基于动态加载)\");\n" +"end\n";KieHelper helper = new KieHelper();helper.addContent(myRule, ResourceType.DRL);KieSession ksession = helper.build().newKieSession();Person person = new Person();person.setAge(12);person.setName("Test");ksession.insert(person);ksession.fireAllRules();ksession.dispose();}}
测试结果:
输出 这个人的年龄不符合要求!(基于动态加载)
上述测试说明Drools可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。
PS:接下来我会进行动态加载规则的性能测试,然后进一步完善动态配置规则的方案。
【Drools】Drools使用入门(一)Drools上手教程(包括动态加载规则文件)相关推荐
- android 加载三方so的方法_Android开发教程之动态加载so库文件的方法
Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...
- java加载js_[Java教程]javascript如何动态加载js文件
[Java教程]javascript如何动态加载js文件 0 2016-01-01 00:00:52 javascript如何动态加载js文件: 有时候我们需要根据需要动态加载js文件,本章节就简单介 ...
- 怎么加载csv_python爬虫入门实战(四)!爬取动态加载的页面
今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...
- python爬虫动态加载_python爬虫入门实战(四)!爬取动态加载的页面!
今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...
- layui 如何动态加载局部页面_python爬虫入门实战(四)!爬取动态加载的页面!
今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
<Spring Cloud Alibaba基础教程>连载中,关注我一起学期!前情回顾: <使用Nacos实现服务注册与发现> <支持的几种服务消费方式> <使 ...
- php ajax loading图片居中显示,PHP语言入门之PHP+ajax实现登录按钮加载loading效果
本篇教程探讨了PHP语言入门之PHP+ajax实现登录按钮加载loading效果,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < php+ajax实现登录按钮加载loa ...
- 转圈加载html,web前端入门到实战:纯CSS实现加载转圈样式
web前端入门到实战:纯CSS实现加载转圈样式 发布时间:2020-05-27 18:11:33 来源:51CTO 阅读:134 作者:前端向南 不同的项目中对于等待加载时转圈圈的样式是不同的,有的是 ...
- Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...
[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...
- echarts java动态数据_[ASP.net教程]ECharts Java 动态加载数据,echartsjava
[ASP.net教程]ECharts Java 动态加载数据,echartsjava 0 2015-12-18 00:00:05 1.前台jsp页面html PUBLIC "-//W3C// ...
最新文章
- bzoj3786星系探索 splay
- crontab 半小时_?用猫粮诱惑,7名消防员花半小时救出困在夹墙间的喵星人
- 文件对比工具Beyond Compare的使用(入门)
- python绘制pr曲线图_如何利用Python制作可以动的动态图表。
- 惊了,掌握了这个炼丹技巧的我开始突飞猛进
- html乱码框框,springmvc+font-awesome开发出的页面显示方框乱码的解决方法
- bzoj1588 营业额统计
- 为何程序员都用茶轴_程序员都用抢票神器,而你还在助力抢票吗?
- 微软官方的SQLHelper类(含完整中文注释)
- 移动端项目实现手机定位
- matlab subs命令,Matlab中subs函数
- 【ML】管理和跟踪机器学习实验
- HAL-STM32-USB内部Flash虚拟U盘更新程序
- PS亮度蒙版工具:Lumenzia for Mac(支持ps2022)
- 数值型数据的表示(2.0)
- 一文了解EpiQuik CUT&RUN m6A RNA富集(MeRIP)试剂盒
- scala中sealed关键字使用指南
- 高校计算机实验管理人员会议,同济大学对口支援高校计算机实验教学研讨会召开...
- linux 系统 DeepIn 安装网卡驱动RTL8812BU
- 2018年2月2日的工作总结