规则引擎drools封装
发布日期: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;
@Slf4j
public 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"
));

进一步优化与扩展

我们还计划在以下方面进行优化与扩展:

  • 提供更全面的规则状态监控功能
  • 开发更高效的规则检索和管理工具 3._COMPLETE此处内容
  • 如需获取更多开发资料,请关注我们的GitHub项目或通过#[联系方式]获取支持。

    上一篇:从Mysql源代码角度分析一句简单sql的查询过程
    下一篇:JAVA中金额数据的处理

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月16日 00时35分35秒