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 ...
随机推荐
- [FLET] 01 可以拖动的方块
from typing import List import flet from flet import ( Container, Draggable, DragTarget, Page, Row, ...
- 详解Web应用安全系列(7)使用具有已知漏洞的组件
使用具有已知漏洞的组件,这种安全漏洞普遍存在,基于组件开发的模式使得多数开发团队根本不了解其应用或API中使用的组件,更谈不上及时更新这些组件了. 下面就分别以.NET和Java各分享一个案例. .N ...
- 结合RNN与Transformer双重优点,深度解析大语言模型RWKV
本文分享自华为云社区<[云驻共创]昇思MindSpore技术公开课 RWKV 模型架构深度解析>,作者:Freedom123. 一.前言 Transformer模型作为一种革命性的神经网络 ...
- Java List对象分组
实体类 必须重写equals和hashCode方法 package com.zcsoft.rc.backend.biz.vo.securityLibary; import java.util.Date ...
- mybatis log4j打印sql语句
依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</a ...
- 小产品,快变现,Solo社区共建者 James 专访
采访人:徐小夕. 本次受邀采访的嘉宾是Solo社区计划负责人&Solo社区联合创建者 James Pan(老潘). 专访内容 1. Solo社区创建的背景 随着国内软件市场内卷加剧,加上大环境 ...
- Vue 数组和对象更新,但视图未更新,背后的故事
在实际开发中,遇到遍历数组和对象,当property 发生改变时,并没有触发视图的更新今天来浅显的聊聊这背后的故事,有说的不对地方,还望指出! 本人博文地址:https://www.cnblogs.c ...
- 第四节 JMeter基础-初级登录【固定用户登录】
声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 1.认识JMeter (1)测试计划:测试的起点,所有组件的容器.相当于一个测试项目,对测试计划展开一系列的操作. (2)线 ...
- python virtualenv虚拟环境配置与使用
python virtualenv虚拟环境配置与使用 By:赖富玉 QQ:1033553122 概述 python开发过程中,我们可能需要同时开发多款应用,这些应用可能公用同一个版本的Python程序 ...
- OpenGL之ShadowMap
流程:先创建一个RenderTexture,然后用灯光的视口渲染. 然后切换到正常相机,进行渲染,使用RenderTexture中的深度或者颜色纹理,然后还原当前顶点在灯光中的深度,两者对比,比缓存中 ...