Drools与动态加载规则文件
Drools简介
Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。
规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释业务规则,以及基于业务规则做出业务决策,从而提供极大的编程便利。
对系统使用人员来说:
- 将业务规则的创建、修改、维护透明话;
- 提高业务灵活度;
- 减少对开发人员的依赖;
- 避免业务升级带来的风险
对开发人员来说:
- 增加代码灵活性;
- 降低系统维护成本,提高系统可维护性;
- 解耦业务与规则,减少代码修改成本;
- 简化系统架构,优化应用结构;
Drools架构图

快速开始
1. Maven导入
<drools.version>7.23.0.Final</drools.version>
<lombok.version>1.18.2</lombok.version>
<dependency>
<groupId>org.kie.server</groupId>
<artifactId>kie-server-client</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
2.Java整合
框架: spring-boot 、Lombok
@Data
public class Person {
private String name;
private int age;
}
3.drl文件的编写,resources下创建rules目录,并编写
import com.mkun.drools.bean.Person; //导入对应bean [?*]
dialect "mvel"
rule "drools-test"
when
$person: Person(age < 16 || age > 50)
then
System.out.println("该人员年龄不符合规则");
end
在对应路径添加Kie文件,resources下创建META-INF文件夹,并且创建文件kmodule.xml
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
<ksession name="all-rules"/>
</kbase>
</kmodule>
4.编写Test测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {
private static KieContainer container = null;
private KieSession statefulKieSession = null;
@Test
public void contextLoads() {
KieServices services = KieServices.Factory.get();
container = services.getKieClasspathContainer();
statefulKieSession = container.newKieSession("all-rules");
Person person = new Person();
person.setAge(15);
person.setName("Drools");
statefulKieSession.insert(person);
statefulKieSession.fireAllRules();
statefulKieSession.dispose();
}
}

5.动态加载规则
@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {
private static KieContainer container = null;
private KieSession statefulKieSession = null;
@Test
public void contextLoads() {
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可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。

示例demo和相关学习资料会同步上传,需要的同学移步下。谢谢支持!!!!
添加 回复 “drools-demo” 获取示例代码

Drools与动态加载规则文件的更多相关文章
- Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- Android应用安全之外部动态加载DEX文件风险
1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...
- js动态加载css文件和js文件的方法
今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...
- 两种动态加载JavaScript文件的方法
两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...
- QUiLoader 动态加载.ui文件
动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...
- 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数
动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...
- 详解QUiLoader 动态加载.ui文件
http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...
- ExtJS4.x动态加载js文件
动态加载js文件是ext4.x的一个新特性,可以有效的减少浏览器的压力,提高渲染速度.如动态加载自定义组件 1.在js/extjs/ux目录下,建立自定义组件的js文件. 2.编写MyWindow.j ...
- Ext JS学习第十天 Ext基础之动态加载JS文件(补充)
此文用来记录学习笔记: •Ext4.x版本提供的一大亮点就是Ext.Loader这个类的动态加载机制!只要遵循路径规范,即可动态加载js文件,方便把自己扩展组件动态加载进来,并且减轻浏览器的压力. • ...
- 动态加载资源文件(ResourceDictionary)
原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...
随机推荐
- Qt中全局变量的定义和使用
全局变量的定义 现在需要将自定义的STRParameter变量定义为全局变量,就需要新建两个文件,分别命名为"global.h"和"global.cpp" 在g ...
- ST 表整体二分解法
整体二分时遍历数组从 \(mid\) 开始的最大值再合并就可以了,时间 \(O(n \log n + q)\) 空间 \(O(n)\). #include<bits/stdc++.h> / ...
- 使用docker搭建ELK分式日志同步方案
ELK作为业界最常用日志同步方案,我们今天尝试一下使用docker快速搭建一套ELK方案.ELK使用国内加速源拉取的镜像比较旧,有条件的朋友可以拉取官网的源.elasticsearch作为日志储存库( ...
- 阿里云服务器安装Docker Compose
官网地址:https://docs.docker.com/compose/install/ 1. sudo curl -L "https://github.com/docker/compos ...
- THM-Skynet-Writeup
通过学习相关知识点:攻破Linux目标机器并完成提权操作. 部署并渗透目标机器 step1 使用Nmap扫描端口 nmap -p- -sC -sV -T4 -v 10.10.164.81 139/44 ...
- 解决方案 | win10任务栏假死,桌面鼠标可以动但是无法点击任务栏图标
1 背景 今天电脑不知道什么原因,鼠标出现了无法点击任务栏图标的情况,但是桌面上可以晃动. 2 解决过程 (方法1-3对我无效,但是不代表对你们无效,) 方法1:重启资源管理器. 方法2:电脑重启.或 ...
- 将传统应用带入浏览器的开源先锋「GitHub 热点速览」
现代浏览器已经不再是简单的浏览网页的工具,其潜能正在通过技术不断地被挖掘和扩展.得益于 WebAssembly 等技术的出现,让浏览器能够以接近原生的速度执行非 JavaScript 语言编写的程序, ...
- 产品探秘:智影AI——你的创意视频制作神器!
只需3步,把小说变成视频.免费试用,首次注册赠送600积分. https://icomicai.com/ 在这个快节奏的时代,创意与效率并重成为了我们追求的新风尚.今天,就让我带你一起揭秘一款颠覆传统 ...
- [oeasy]python0010_怎么用命令行保存文件
编写 py 文件 回忆上次内容 上次 真的输出了 程序员的浪漫 Hello world! print函数 可以输出 字符串 但是 print这个词 别拼错 就连 大小写 也别能错 错了就改 也没事 ...
- 数据分析应该掌握的知识及SQL技能
一.概念及常识 1.数据分析必备的统计学知识 描述统计学 1.平均值.中位数.众数 2.方差.标准差 3.统计分布:正态分布.指数分布.二项分布.卡方分布 推论统计学 1.假设检验 2.置信区间 3. ...