网站首页 > 技术文章 正文
动态规则,是指在不重启服务器的前提下使业务规则发生变化,且不影响服务器的正常使用,从而实现动态业务变化的规则。
如果还不了解drools的情况下,请先查看作者其他两篇关于drools的文章。
drools动态规则的实现主要有两种方式:字符串拼接方式和构建kjar两种。
字符串拼接的方式
一个drools的规则文本如下:
```
package rules.rulesHelo
import com.pojo.Person
rule “规则1"
when
eval(true);
then
System.out.println(“hello world”);
end
rule “规则2"
when
$p:Person();
then
System.out.println(“对象” + $p);
end
```
原理:
1.可以将规则文本以字符串的形式存储在数据库中。
2.然后定时从数据库中拉取最新的规则文本的字符串。
3.将规则文本一次性加载到内存中。
4.基于业务取选择覆盖或者新增,重新build,然后进行全局缓存。
具体实现:
public KieContainer loadForRule(String drlStr) {
KieServices ks = KieServices.Factory.get();
KieRepository kr = ks.getRepository();
KieFileSystem kfs = ks.newKieFileSystem();
kfs.write("src/main/resources/rules/" + drlStr.hashCode() + ".drl", drlStr);
// 将KieFileSystem加入到KieBuilder
KieBuilder kb = ks.newKieBuilder(kfs);
// 编译此时的builder中所有的规则
kb.buildAll();
if (kb.getResults().hasMessages(Message.Level.ERROR)) {
throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
}
return ks.newKieContainer(kr.getDefaultReleaseId());
}
后续从缓存中加载规则:
KieSession kieSession = kContainer.newKieSession();
构建kjar
生成kjar的动态规则与拼接字符串的方式有相似之处,核心思想与Workbench构建kjar相似,kjar的核心思想是kmodule.xml配置文件,而Kie为开发人员提供了这样的API。
原理:
规则引擎服务中并不包含规则,服务启动时,将从Maven存储库中拉取kjar包(实际上就是一个约定好的jar包),并加载其中的规则。
启动以后,规则引擎服务将不停的监视Maven存储库中的规则kjar包是否更新(轮训监控,监控时间为kScanner 中配置),如果更新则更新其中新的规则,规则引起服务本身不需重新启动。
核心实现:
private KieContainer kContainer;
@PostConstruct
public void setUp() {
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("com.amao.drools", "rules-kjar", "1.0-SNAPSHOT");
kContainer = ks.newKieContainer(releaseId);
KieScanner kScanner = ks.newKieScanner(kContainer);
//定时轮训(单位,毫秒)仓库中对应的jar包
kScanner.start(10000L);
}
rules-kjar包是一个kjar项目,其中包含了kmodule.xml文件和Drools规则.drl文件。kjar项目是指引入了kie-maven-plugin插件,并指定打包为kjar,在打包的过程中,插件会校验以drl定义的规则是否可以正常编译。
drools官方文档
https://docs.jboss.org/drools/release/7.6.0.Final/drools-docs/html_single/index.html#_kiescanner
猜你喜欢
- 2024-11-16 drools的类型声明(Type declarations)
- 2024-11-16 规则引擎drools-实战个人所得税计算器
- 2024-11-16 基于 Flink 和 Drools 的实时日志处理
- 2024-11-16 开源、强大的工作流引擎:camunda入门介绍
- 2024-11-16 53-SpringBoot整合Drools_2(springboot整合zuul)
- 2024-11-16 开启灵活开发编码模式:规则引擎drools——LHS部分
- 2024-11-16 AI应用企业落地方法论:践行财务共享AI审单项目
- 2024-11-16 开启灵活开发编码模式:规则引擎drools——RHS部分
- 2024-11-16 开启灵活开发编码模式:规则引擎drools——高级语法global
- 2024-11-16 43-drools基础语法(比较操作符_memberof)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)