Drools开源业务规则引擎(三)- 事件模型(Event Model)
文章目录
- Drools开源业务规则引擎(三)- 事件模型(Event Model)
- 1.org.kie.api.event
- 2.RuleRuntimeEventManager
- 3.RuleRuntimeEventListener
- 接口说明
- 示例
- 规则文件
- 规则执行
- 日志输出
- 4.AgentaEventListener
- 接口说明
- 示例
- 监听器实现类MyAgendaEventListener
- 规则文件
- 规则执行
- 日志输出
Drools开源业务规则引擎(三)- 事件模型(Event Model)
1.org.kie.api.event
在org.kie.api.event 中提供了规则引擎相关的事件监听和处理机制,允许开发者在规则引擎执行过程中监听和处理事件,包括规则触发、断言对象等,并且还有利于将日志记录和应用程序的核心功能(以及规则)分离。
接口摘要
| Interface | Description |
|---|---|
| KieRuntimeEvent | KIE运行时生成的事件。 |
| KieRuntimeEventManager | KIE运行事件的管理器 |
KieRuntimeEventManager接口由KieRuntime实现,它提供两个接口,RuleRuntimeEventManager和ProcessEventManager(KieRuntimeEventManager类图如下)。本章仅介绍RuleRuntimeEventManager。

2.RuleRuntimeEventManager
RuleRuntimeEventManager允许添加和删除侦听器,以便可以侦听工作内存和agenda的事件。

Drools 还提供DebugRuleRuntimeEventListener和DebugAgentaEventListener,通过调试打印语句实现每个方法。
示例
//添加 DebugRuleRuntimeEventListener
ksession.addEventListener( new DebugRuleRuntimeEventListener());
//添加 DebugAgentaEventListener
ksession.addEventListener( new DebugAgentaEventListener());
3.RuleRuntimeEventListener
接口说明
public interface RuleRuntimeEventListener extends EventListener {void objectInserted(ObjectInsertedEvent event);void objectUpdated(ObjectUpdatedEvent event);void objectDeleted(ObjectDeletedEvent event);
}
objectInserted:表示发生了插入事实的事件objectUpdated:表示发生了更新事实的事件objectDeleted:表示发生了删除事实的事件
示例
规则文件
rule "age"
enabled true
when$in:UserIn(age > 10)
then$in.setAge(1);update($in);
endrule "in_rule"
enabled true
when$in:UserIn(name in ("jack","mary"))
thenoutput.setAgeStages("命中了in条件");delete($in);
end
规则执行
KieBase kieBase = kieHelper.build(kieBaseConfiguration);
// 创建会话
KieSession kieSession = kieBase.newKieSession();
// 创建规则输出对象
UserOut output = new UserOut();
kieSession.setGlobal("output", output);
// 创建规则输入对象
UserIn input = new UserIn();
input.setAge(19);
input.setName("jack");
// 添加事件监听
kieSession.addEventListener(new DebugRuleRuntimeEventListener());
// 执行规则
kieSession.insert(input);
kieSession.fireAllRules();
日志输出

4.AgentaEventListener
接口说明
public interface AgendaEventListenerextendsEventListener {void matchCreated(MatchCreatedEvent event);void matchCancelled(MatchCancelledEvent event);void beforeMatchFired(BeforeMatchFiredEvent event);void afterMatchFired(AfterMatchFiredEvent event);void agendaGroupPopped(AgendaGroupPoppedEvent event);void agendaGroupPushed(AgendaGroupPushedEvent event);void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);
}
matchCreated:在规则匹配创建时触发,当规则条件满足时,创建一个匹配项。matchCancelled:在规则匹配取消时触发,当规则条件不再满足时,取消一个匹配项。beforeMatchFired:在规则执行前触发,可以用于在规则执行前进行一些前置处理。afterMatchFired:在规则执行后触发,可以用于在规则执行后进行一些后置处理。agendaGroupPopped:当一个AgendaGroup被弹出Popped时,将触发此方法。AgendaGroup是drl中的一个逻辑分组,它可以包含多个规则Rule。当某个AgendaGroup不再是活动状态时,即规则引擎不再对其进行处理时,该AgendaGroup将被弹出。agendaGroupPushed:当一个AgendaGroup被推入Pushed规则引擎时,将触发此方法。。当某个AgendaGroup变为活动状态时,即规则引擎开始对其进行处理时,该AgendaGroup将被推入。beforeRuleFlowGroupActivated:当一个规则流组RuleFlowGroup被激活之前,将触发此方法。afterRuleFlowGroupActivated:当一个规则流组RuleFlowGroup被激活之后,将触发此方法。beforeRuleFlowGroupDeactivated:当一个规则流组RuleFlowGroup被停用之前,将触发此方法afterRuleFlowGroupDeactivated:当一个规则流组RuleFlowGroup被停用之后,将触发此方法
示例
监听器实现类MyAgendaEventListener
创建一个监听器实现类MyAgendaEventListener,继承AgentaEventListener监听器接口默认的实现类DefaultAgendaEventListener。
@Slf4j
public class MyAgendaEventListener extends DefaultAgendaEventListener {@Overridepublic void matchCreated(MatchCreatedEvent event) {log.info("规则匹配创建:{}",event.getMatch().getRule().getName());}@Overridepublic void matchCancelled(MatchCancelledEvent event) {log.info("规则匹配取消:{}",event.getMatch().getRule().getName());}@Overridepublic void beforeMatchFired(BeforeMatchFiredEvent event) {log.info("规则执行前:{}",event.getMatch().getRule().getName());}@Overridepublic void afterMatchFired(AfterMatchFiredEvent event) {log.info("规则执行后:{}",event.getMatch().getRule().getName());}@Overridepublic void agendaGroupPopped(AgendaGroupPoppedEvent event) {log.info("AgendaGroup弹出:{}",event.getAgendaGroup().getName());}@Overridepublic void agendaGroupPushed(AgendaGroupPushedEvent event) {log.info("AgendaGroup推入:{}",event.getAgendaGroup().getName());}@Overridepublic void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {log.info("RuleFlowGroup激活前:{}",event.getRuleFlowGroup().getName());}@Overridepublic void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {log.info("RuleFlowGroup激活后:{}",event.getRuleFlowGroup().getName());}@Overridepublic void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) {log.info("RuleFlowGroup停用前:{}",event.getRuleFlowGroup().getName());}@Overridepublic void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) {log.info("RuleFlowGroup停用后:{}",event.getRuleFlowGroup().getName());}
}
规则文件
rule "age"
enabled true
// 自版本6.x起,agenda-group和ruleflow-group两个概念已经合并
// ruleflow-group "flow" 相当于 agenda-group "flow"
ruleflow-group "flow"
when$in:UserIn(age > 10)
thenoutput.setAgeStages("大于10");
endrule "in_rule"
enabled true
ruleflow-group "flow"
when$in:UserIn(age <= 10)
thenoutput.setAgeStages("小于等于10");
end
规则执行
KieBase kieBase = kieHelper.build(kieBaseConfiguration);
// 创建会话
KieSession kieSession = kieBase.newKieSession();
// 创建规则输出对象
UserOut output = new UserOut();
kieSession.setGlobal("output", output);
// 创建规则输入对象
UserIn input = new UserIn();
input.setAge(19);
input.setName("jack");
// 设置焦点
kieSession.getAgenda().getAgendaGroup("flow").setFocus();
// 添加事件监听
kieSession.addEventListener(new MyAgendaEventListener());
// 执行规则
kieSession.insert(input);
kieSession.fireAllRules();
日志输出

相关文章:
Drools开源业务规则引擎(三)- 事件模型(Event Model)
文章目录 Drools开源业务规则引擎(三)- 事件模型(Event Model)1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My…...
智慧校园行政办公升级,日程监控不可或缺
在智慧校园的行政办公场景下,日程监控功能扮演了一个核心协调者的角色,它细腻地编织起时间管理的网络,确保各项活动与任务在井然有序中高效推进。这一功能通过以下几个方面,展现了其在提升工作效率与团队协作方面的独特价值。 首先…...
RedHat运维-Linux SSH基础3-sshd守护进程
1. sshd这个守护进程提供了OpenSSH服务,请问可以通过编辑哪些配置文件,来配置这个服务呢?________________________ 2. sshd这个守护进程提供了OpenSSH服务,请问可以通过编辑哪些配置文件,来配置这个服务呢?…...
医院产科信息化管理系统源码,智慧产科管理系统,涵盖了从孕妇到医院初次建档、历次产检、住院分娩、统计上报到产后42天全部医院服务的信息化管理。
医院产科信息化管理系统源码,智慧产科管理系统,产科专科电子病历系统 技术架构:前后端分离Java,Vue,ElementUIMySQL8.0.36 医院产科信息化管理系统,通过构建专科病例系统实现临床保健一体化,涵…...
Softmax作为分类任务中神经网络输出层的优劣分析
Softmax作为分类任务中神经网络输出层的优劣分析 在深度学习领域,Softmax函数作为分类任务中神经网络的输出层,被广泛应用并展现出强大的优势。然而,任何技术都有其两面性,Softmax函数也不例外。本文将从多个角度深入分析Softmax…...
404白色唯美动态页面源码
404白色唯美动态页面源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 404白色唯美动态页面源码...
细说MCU的ADC模块单通道连续采样的实现方法
目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…...
H2 Database Console未授权访问漏洞封堵
背景 H2 Database Console未授权访问,默认情况下自动创建不存在的数据库,从而导致未授权访问。各种未授权访问的教程,但是它怎么封堵呢? -ifExists 很简单,启动参数添加 -ifExists ,它的含义:…...
基于java+springboot+vue实现的药店管理系统(文末源码+Lw)285
摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,药品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…...
网络爬虫基础
网络爬虫基础 网络爬虫,也被称为网络蜘蛛或爬虫,是一种用于自动浏览互联网并从网页中提取信息的软件程序。它们能够访问网站,解析页面内容,并收集所需数据。Python语言因其简洁的语法和强大的库支持,成为实现网络爬虫…...
js数组方法归纳——push、pop、unshift、shift
以下涉及到的数组的四个基础方法均会改变原数组!!! 1、 push() 该方法可以向数组的末尾添加一个或多个元素,并返回数组的新的长度可以将要添加的元素作为方法的参数传递,这样这些元素将会自动添加到数组的末尾该方法会将数组新的长度作为返回值返回 //创…...
VPN是什么?
VPN,全称Virtual Private Network,即“虚拟私人网络”,是一种在公共网络(如互联网)上建立加密、安全的连接通道的技术。简单来说,VPN就像是一条在公共道路上铺设的“秘密隧道”,通过这条隧道传输…...
浅析DDoS高防数据中心网络
随着企业业务的持续拓展和数智化转型步伐的加快,数据中心已逐渐演变为企业数据存储、处理和应用的关键部署场地,这也使得数据中心面临着日益严峻的网络安全风险,其中DDoS攻击以其高效性依旧是数据中心面临的主要威胁之一。伴随着数智化的发展…...
《安全行业大模型技术应用态势发展报告(2024)》
人工智能技术快速迭代发展,大模型应用场景不断拓展,随着安全行业对人工智能技术的应用程度日益加深,大模型在网络安全领域的应用潜力和挑战逐渐显现。安全行业大模型技术的应用实践不断涌现,其在威胁检测、风险评估和安全运营等方…...
【基于R语言群体遗传学】-4-统计建模与算法(statistical tests and algorithm)
之前的三篇博客,我们对于哈代温伯格遗传比例有了一个全面的认识,没有看的朋友可以先看一下前面的博客: 群体遗传学_tRNA做科研的博客-CSDN博客 1.一些新名词 (1)Algorithm: A series of operations executed in a s…...
Java springboot校园管理系统源码
Java springboot校园管理系统源码-014 下载地址:https://download.csdn.net/download/xiaohua1992/89364089 技术栈 运行环境:jdk8 tomcat9 mysql5.7 windows10 服务端技术:Spring Boot Mybatis VUE 使用说明 1.使用Navicati或者其它工…...
Lianwei 安全周报|2024.07.01
新的一周又开始了,以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 出于安全考虑,拜登下令禁用卡巴斯基杀毒…...
柯桥职场英语学习商务英语口语生活英语培训生活口语学习
辣妹用英语怎么说? 辣妹在英语中通常被翻译为“hot girl”或“spicy girl”,但更常见和直接的是“hot chick”或简单地使用“hot”来形容。 举个例子: Shes a real hot girl with her trendy outfit and confident attitude. 她真是个辣妹࿰…...
Spring与Quartz整合
Quartz框架是一个轻量级的任务调度框架,它提供了许多内置的功能,包括:支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下: …...
C++之static关键字
文章目录 前提正文多重定义extern关键字使用staticstatic 全局变量(在.cpp文件中定义)static变量存放在哪里static变量可不可以放在.h文件中 static 函数static局部变量static 成员变量static 成员函数 总结参考链接 前提 好吧,八股,我又回来了。这次想…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项
一、条形码识别改名使用教程 打开软件并选择处理模式:打开软件后,根据要处理的文件类型,选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件,就选择 “PDF 识别模式”;若是处理图片文件&…...
