
规则引擎drools封装
提供更全面的规则状态监控功能 开发更高效的规则检索和管理工具 3._COMPLETE此处内容
发布日期:2021-05-10 05:11:24
浏览次数:27
分类:精选文章
本文共 5170 字,大约阅读时间需要 17 分钟。
关于Drools规则引擎的实践经验与封装
前言
Drools规则引擎在开发中应用广泛,但由于其复杂性,许多开发者在实际项目中未能充分发挥其潜力。本文作者经过两次项目实践,总结了对Drools的理解,并进行了封装,旨在简化规则引擎的使用和管理,同时探讨如何高效获取和使用规则内容。
设计思路与具体实现
为了实现轻量级的Drools使用,我们遵循以下设计理念:保持架构简洁,便于与其他项目无缝融合。具体实现包括规则的动态获取、远程管理和灵活配置。
动态规则管理
我们设计了一个工具类DroolsUtils
,支持从本地规则文件和远程仓库中动态获取规则内容。通过Maven和Drools6.5提供的API,实现了对规则资源的灵活管理和版本控制。
工具类实现详解
下面是DroolsUtils
工具类的核心功能解析:
package com.vip.jie.rule.util;import org.drools.compiler.kie.builder.impl.InternalKieModule;import org.kie.api.KieServices;import org.kie.api.builder.KieBuilder;import org.kie.api.builder.KieFileSystem;import org.kie.api.builder.ReleaseId;import org.kie.api.builder.model.KieBaseModel;import org.kie.api.builder.model.KieModuleModel;import org.kie.api.builder.model.KieSessionModel;import org.kie.api.conf.EqualityBehaviorOption;import org.kie.api.conf.EventProcessingOption;import java.io.IOException;public class DroolsUtils { private static KieFileSystem createKieFileSystemWithKProject(KieServices ks, boolean isdefault) { KieModuleModel kproj = ks.newKieModuleModel(); KieBaseModel kieBaseModel1 = kproj.newKieBaseModel("KBase").setDefault(isdefault) .setEqualsBehavior(EqualityBehaviorOption.EQUALITY) .setEventProcessingMode(EventProcessingOption.STREAM); // 配置KieSession kieBaseModel1.newKieSessionModel("KSession").setDefault(isdefault) .setType(KieSessionModel.KieSessionType.STATEFUL); KieFileSystem kfs = ks.newKieFileSystem(); kfs.writeKModuleXML(kproj.toXML()); return kfs; } private static String getPom(ReleaseId releaseId, ReleaseId... dependencies) { String pom = " " + "" + " 4.0.0 " + "" + releaseId.getGroupId() + " " + "" + releaseId.getArtifactId() + " " + "" + releaseId.getVersion() + " "; if (dependencies != null && dependencies.length > 0) { for (ReleaseId dep : dependencies) { pom += " < dependency>" + "" + dep.getGroupId() + " " + "" + dep.getArtifactId() + " " + "" + dep.getVersion() + " " + " "; } } return pom; } public static InternalKieModule createKieJar(KieServices ks, ReleaseId releaseId, DroolsResource droolsResource) throws IOException { KieFileSystem kfs = createKieFileSystemWithKProject(ks, true); kfs.writePomXML(getPom(releaseId)); kfs.write("src/main/resources/" + droolsResource.getTargetResourceName(), droolsResource.getResource()); KieBuilder kieBuilder = ks.newKieBuilder(kfs); if (!kieBuilder.getResults().getMessages().isEmpty()) { throw new IllegalStateException("Error creating KieBuilder. errorMsg:" + kieBuilder.getResults().getMessages()); } return (InternalKieModule) kieBuilder.getKieModule(); }}
实际应用示例
单元测试类
package com.vip.jie.rule.service.impl;import com.vip.jie.rule.object.User;import com.vip.jie.rule.service.RuleManager;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import static junit.framework.TestCase.fail;import org.kie.api.rulemanager.RuleManager;@Slf4jpublic class RuleManagerImplTest { private RuleManager ruleManager = new RuleManagerImpl(); private String getRuleContent() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("import com.vip.jie.rule.object.User;\n"); stringBuilder.append("rule test1 when\n"); stringBuilder.append("user : User(age==20)\n"); stringBuilder.append("then\n"); stringBuilder.append("user.setName(\"张三\");\n"); stringBuilder.append("end\n"); return stringBuilder.toString(); } @Test public void executeRule1() throws Exception { User user = new User(); user.setAge(20); ruleManager.executeRule("test1", getRuleContent(), user); log.info("test result:{}", user.toString()); if (!"张三".equals(user.getName())) { fail("error rule"); } } @Test public void executeRule2() throws Exception { User user = new User(); user.setAge(21); ruleManager.executeRule("test1", getRuleContent(), user); log.info("test result:{}", user.toString()); if ("张三".equals(user.getName())) { fail("error rule"); } }}
工具类应用示例
String fileName = "jie-" + group + "-rules";ReleaseId releaseId = kieServices.newReleaseId("com.vip.jie", fileName, "1.0.0");log.info("DroolsGetKieSession fileName:{}", fileName);log.info("[DroolsGetKieSession] drlStr:{}", drlStr);InternalKieModule kJar = DroolsUtils.createKieJar(kieServices, releaseId, new DroolsResource( ResourceFactory.newByteArrayResource(drlStr.getBytes()), fileName + ".drl"));
进一步优化与扩展
我们还计划在以下方面进行优化与扩展:
如需获取更多开发资料,请关注我们的GitHub项目或通过#[联系方式]获取支持。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月16日 00时35分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
带照片捕捉功能的ESP32-CAM PIR运动检测器
2019-03-15
ARM Mbed RFID读取器
2019-03-15
如何使用SSH远程管理Linux服务器
2019-03-15
降级到旧版本macOS的3种方法
2019-03-15
学习Vue.js2.0(国外视频教程)
2019-03-15
在FPGA板上实现数字时钟的VHDL代码
2019-03-15
wxPython和PyOpenGL视频
2019-03-15
在30分钟内学习PHP
2019-03-15
Python http.server 服务器
2019-03-15
Python svm 支持向量机
2019-03-15
OpenStack 最小化安装配置(一):物理机网桥配置
2019-03-15
shell中将字符中换行符'\n'替换为空格
2019-03-15
PS快速美白照片
2019-03-15
ubuntu 16.04 镜像下载
2019-03-15
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
2019-03-15
pip国内镜像(清华大学镜像)
2019-03-15
浅学C#(25)——任务Task
2019-03-15
原生的JavaScript控制复选框的选项个数
2019-03-15
微信小程序云开发:怎么删除云函数?已解决
2019-03-15