一、环境概述
JDK:openjdk version "1.8.0_452"
Maven: maven 3.8.8
Drools:Drools 7.73.0.Final
SpringBoot:SpringBoot 2.7.18
二、项目依赖
这里没有引入drools-spring依赖了,是直接手动把组件IOC的。
POM.xml
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>2.7.18</spring-boot.version><drools.version>7.73.0.Final</drools.version><lombok.version>1.18.30</lombok.version><junit.version>4.13.2</junit.version></properties><!-- 使用 dependencyManagement 管理 Spring Boot 和 Drools 版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-bom</artifactId><version>${drools.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- Drools依赖 --><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId></dependency><!-- 决策表要用 --><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId></dependency><!-- SpringBoot依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><!-- 排除 JUnit 5(因为要用 JUnit 4) --><exclusions><exclusion><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></exclusion><exclusion><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId></exclusion></exclusions></dependency><!-- 若为Web项目,添加此依赖 (二选一)--><!-- <dependency>--><!-- <groupId>org.springframework.boot</groupId>--><!-- <artifactId>spring-boot-starter-web</artifactId>--><!-- </dependency>--><!-- 若为非Web项目,添加此依赖 (二选一) 这里我就不用web跑了,直接starter跑了--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><!-- junit 4 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies>
三、实体类和配置类
注意:这里没有用读取kmodule.xml的方式创建KieBase了,是直接代码配置类方式配置的
src/main/java/com/online/admin/entity/Person.java
package com.online.admin.entity;import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Person
{private String name;private int age;
}
src/main/java/com/online/admin/config/DroolsConfig.java
package com.online.admin.config;import lombok.extern.slf4j.Slf4j;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
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 org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;/*** Drools配置类*/
@Slf4j
@Configuration
public class DroolsConfig {@Beanpublic KieServices getKieServices() {return KieServices.Factory.get();}/*** 这里就类似于读取kmodule.xml,创建模型类*/@Beanpublic KieModuleModel kieModuleModel(KieServices kieServices) {KieModuleModel kieModuleModel = kieServices.newKieModuleModel();KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("rule1").setDefault(false).addPackage("rule1").setEqualsBehavior(EqualityBehaviorOption.EQUALITY).setEventProcessingMode(EventProcessingOption.STREAM);//有状态类型的Session就是规则执行过程中会话会一直存在,改变工作内存对象会再次触发规则判断,重新计算,重新输出结果。//无状态类型的Session就要求你在开始计算的时候把所需所有事实对象全部传入,执行完计算以后会话就不存在了,只是会返回结果。// 这里是用的有状态演示// 有状态类型kieBaseModel1.newKieSessionModel("ksession-rules1").setType(KieSessionModel.KieSessionType.STATEFUL);KieBaseModel kieBaseModel2 = kieModuleModel.newKieBaseModel("rule2").setDefault(false).addPackage("rule2").setEqualsBehavior(EqualityBehaviorOption.EQUALITY).setEventProcessingMode(EventProcessingOption.STREAM);// 有状态类型kieBaseModel2.newKieSessionModel("ksession-rules2").setType(KieSessionModel.KieSessionType.STATEFUL);return kieModuleModel;}// 这里我打算根据数据库或者配置中心读取配置创建,先读取Module配置,// 然后根据配置读取映射的drl文件位置,根据模块区分开不同模块下的的Session。// 这里是写死的,组件生命周期管理有问题,玩玩可以,项目上千万别学@Beanpublic KieFileSystem kieFileSystem(KieServices kieServices,KieModuleModel kieModuleModel) throws IOException {KieFileSystem kieFileSystem = kieServices.newKieFileSystem();ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();kieFileSystem.writeKModuleXML(kieModuleModel.toXML());// 1. 加载属于KieBase "rules1"的规则(路径:rule1/*.drl)Resource[] rule1Resources = resolver.getResources("classpath*:rule1/*.drl");for (Resource resource : rule1Resources) {// 规则文件路径对应KieBase1的package:"rule1"String resourcePath = "rule1/" + resource.getFilename();kieFileSystem.write(ResourceFactory.newClassPathResource(resourcePath, "UTF-8"));log.info("已加载KieBase(rules1)的规则文件: {}", resourcePath);}// 2. 加载属于KieBase "rules2"的规则(路径:rule2/*.drl)Resource[] rule2Resources = resolver.getResources("classpath*:rule2/*.drl");for (Resource resource : rule2Resources) {// 规则文件路径对应KieBase2的package:"rule2"String resourcePath = "rule2/" + resource.getFilename();kieFileSystem.write(ResourceFactory.newClassPathResource(resourcePath, "UTF-8"));log.info("已加载KieBase(rules2)的规则文件: {}", resourcePath);}return kieFileSystem;}@Beanpublic KieContainer kieContainer(KieServices kieServices, KieFileSystem kieFileSystem, KieModuleModel kieModuleModel) {// 构建KieModuleKieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);// 构建KieRepositoryKieRepository kieRepository = kieServices.getRepository();//这里我是自己玩搭建环境,用的默认的版本号,实际这里可能要自定义releaseId(规则版本号,用于区分规则版本是否发生变化用于热部署)kieRepository.addKieModule(kieRepository::getDefaultReleaseId);// 执行构建kieBuilder.buildAll();// 检查构建错误if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {log.error("规则构建失败: {}", kieBuilder.getResults().getMessages());throw new RuntimeException("规则构建失败,请检查规则文件");}// 创建KieContainerreturn kieServices.newKieContainer(kieRepository.getDefaultReleaseId());}
}
四、drl文件(两个内容差不多,但是包名称和位置不一样)
src/main/resources/rule1/rule1.drl
package rule1;
import com.online.admin.entity.Person;rule "Age Check Rule"when$p : Person(age >= 18)thenSystem.out.println("[rules1规则触发] " + $p.getName() + " 是成年人,年龄: " + $p.getAge());
endrule "Check using eval"when$p : Person()eval( $p.getAge() >= 18 )thenSystem.out.println("rules1条件满足");
end
src/main/resources/rule2/rule2.drl
package rule2;
import com.online.admin.entity.Person;rule "Age Check Rule"when$p : Person(age < 18)thenSystem.out.println("[rules2规则触发] " + $p.getName() + " 不是成年人,年龄: " + $p.getAge());
endrule "Check using eval"when$p : Person()eval( $p.getAge() >= 18 )thenSystem.out.println("rules2条件满足");
end
五、测试类
package com.online.admin;import com.online.admin.config.DroolsConfig;
import com.online.admin.entity.Person;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.Collection;@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DroolsConfig.class)
public class AppTest {@Autowiredprivate KieContainer kieContainer;@Testpublic void testRule1() {KieSession kieSession = null;try {Collection<String> kieBaseNames = kieContainer.getKieBaseNames();log.info("kieBaseNames : {}", kieBaseNames);kieSession = kieContainer.newKieSession("ksession-rules1");KieBase kieBase = kieSession.getKieBase();log.info("kieBase : {}", kieBase.getKiePackages());
// Rule rule=kieBase.getRule("rule1","Age Check Rule");
// log.info("rule : {}", rule.getName());Person adult = new Person("李四", 25);kieSession.insert(adult);int firedRules = kieSession.fireAllRules();log.info("触发了 {} 条规则", firedRules);} catch (RuntimeException e) {log.error("规则执行失败", e);Assert.fail(e.getMessage());throw e;} finally {if (kieSession != null) {try {kieSession.dispose();} catch (RuntimeException e) {log.error("kiesession关闭失败,{}", e.getMessage());}}}}@Testpublic void testRule2() {KieSession kieSession = null;try {kieSession = kieContainer.newKieSession("ksession-rules2");Person adult = new Person("李四", 12);kieSession.insert(adult);int firedRules = kieSession.fireAllRules();log.info("触发了 {} 条规则", firedRules);} catch (RuntimeException e) {log.error("规则执行失败", e);Assert.fail(e.getMessage());throw e;} finally {if (kieSession != null) {try {kieSession.dispose();} catch (RuntimeException e) {log.error("kiesession关闭失败,{}", e.getMessage());}}}}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921894.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
网站建设赚钱吗排版设计是什么工作
基于WebSocket实现的后台服务,用于接收客户端的心跳消息,并根据心跳消息来维护客户端连接。
具体实现中,服务启动后会创建一个HttpListener对象,用于监听客户端的WebSocket连接请求。当客户端连接成功后,服务会为每个…
h5购物网站模板wordpress 整站源码
1. 初识http HTTP 最新的版本应该是 HTTP/3.0,目前大规模使用的版本 HTTP/1.1; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同,HTTP 的报文格式&a…
超能力联盟网站乐清网站只做
2019独角兽企业重金招聘Python工程师标准>>> property (nonatomic, assign) CGRect prototypeRect; -----这样的声明应该没有问题的,的if(!self.prototypeRect)报错是因为 CGRect是结构体,不能作非nil判断,你可以利用self.protot…
redis使用lua脚本迁移数据到集群版redis失败怎么解决
假如使用Lua脚本做数据迁移,比如迁移到阿里云的tair的时候,会报错,原因是集群版的redis,脚本里的所有keys,都是同一个slot的。但是redis的slot有16384个,很难保证插入的数据是同一个slot。假如分开不同的slot来插…
【IEEE-CPS出版】2025年数据管理与计算机科学国际学术会议(ICDMCS 2025)
2025年数据管理、计算机科学国际学术会议(ICDMCS 2025),将于2025年10月24-26日在中国江苏省南京市召开。【高录用快见刊、检索:合作IEEE-CPS出版社审稿录用速度快,最快投稿后2-4个月左右见刊,见刊后1个月左右EI、S…
详细介绍:医疗编程AI技能树与培训技能树报告(国内外一流大学医疗AI相关专业分析2025版,下)
详细介绍:医疗编程AI技能树与培训技能树报告(国内外一流大学医疗AI相关专业分析2025版,下)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…
实用指南:Unity单元测试:C语言轻量级框架实战
实用指南:Unity单元测试:C语言轻量级框架实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…
做网站可能遇到的困难做站群的网站要备案吗
1查看数据情况
df.shape
df.info()
2.用指定值填充
df df.fillna(x)
3.判断是否缺失
df.isnull()
4.删除缺失数据
df df.dropna()
5.补充平均值
df df.fillna(df.mean())
6.填充他前面一个元素值(ffill向前填充,bfill向后填充)(limit:可以…
网站上不去首页seo要怎么办wordpress 补丁
基本介绍
Java Agent是一种特殊的Java程序,它允许开发者在Java虚拟机(JVM)启动时或运行期间通过java.lang.instrument包提供的Java标准接口进行代码插桩,从而实现在Java应用程序类加载和运行期间动态修改已加载或者未加载的类,包括类的属性、…
免费的网站域名商业网站案例
基于Docker for Windows部署ChatGPT-Next-Web 项目地址安装Docker for Windows部署项目参数讲解参数示例 运行 项目地址
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web
安装Docker for Windows
官网地址:https://www.docker.com/ 下拉找到Download 选择W…
【ACM出版】第五届管理科学和软件工程国际学术会议(ICMSSE 2025)
第五届管理科学和软件工程国际学术会议(ICMSSE 2025)将于2025年10月24-26日于南京召开。【高届数、范围广、录用高、见刊快、检索稳】
【管理科学、软件工程、计算机相关主题方向均可投稿】
第五届管理科学和软件工程国…
PiXYZ Studio 2021下载地址与安装教程
软件介绍
PiXYZ Studio 2021是Unity公司推出的专业3D数据准备与优化工具,专为处理复杂CAD、3D和点云模型设计。该版本通过集成自动化批处理、实时协作与跨平台兼容功能,显著提升工业设计与实时3D开发的效率。其核心功…
coremail日常操作
客户端下载:
https://www-lunkr.coremail.cn/download.html#email
创建测试用户:
登录webadmin,点组织管理-用户管理,新建用户
很多网站开发没有框架如何制作的如何 做网站挣钱
wow代码人们让钱包瑟瑟发抖的双十一已经来啦与此同时码不停蹄地向你奔赴而来的还有 CSDN 为你准备的???? 1 元秒杀 ????价值 3.5 万元的爆款电子书限时特惠,仅需 1 元你,准备好了吗仅限 1000 人速领????????????错过悔10年系列好书
Win 10 LSTC 使用 Podman - tfel
小记一下 Win 10 LTSC 上运行 WSL, Podman 相关的知识前言全文仅为个人折腾记录因为需要跑 docker,发现自己的电脑上还没有装。加上先前在网上看到有人对比 Docker 和 Podman以及之前自己使用 Colima 的记忆, 决定用 …
深入解析:在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档
深入解析:在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档2025-09-29 14:03
tlnshuju
阅读(0)
评论(0) 收藏
举报pre { white-space: pre !important; word-wrap: normal !important; overflo…
网站开发知乎wordpress进入
如图所示,在公式后面加编码后公式也变小了:
加编码前: 加编码后: 采用样式分隔符(Ctrlaltenter)即可解决,输完公式后,按enter转行,输入你要的东西(编号什么的…
电脑和手机都能浏览的网站开发网站开发后端需要哪些技术
来源 | 扔物线责编 | Carol文章开始之前,首先来看个视频:开始说到依赖注入,做 Android 的人都会想到一个库:Dagger;说到 Dagger,大家的反应普遍是一套三连:牛逼、高端、我才不用。又牛逼又高端&…
商丘做网站的公司肇庆企业做网站
点击上方蓝字关注我们!因为分享,我们相遇在SEO路上“网站上线一段时间了,为什么没有流量?为什么没有询盘?”对于做网络营销的企业而言,网站流量与询盘是建立网站的根本目的,可是为什么操作了一段…
网站后台信息发布这样做网站开发工具介绍
455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有…