当前位置: 首页 > news >正文

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 中提供了规则引擎相关的事件监听和处理机制,允许开发者在规则引擎执行过程中监听和处理事件,包括规则触发、断言对象等,并且还有利于将日志记录和应用程序的核心功能(以及规则)分离。

接口摘要

InterfaceDescription
KieRuntimeEventKIE运行时生成的事件。
KieRuntimeEventManagerKIE运行事件的管理器

KieRuntimeEventManager接口由KieRuntime实现,它提供两个接口,RuleRuntimeEventManagerProcessEventManagerKieRuntimeEventManager类图如下)。本章仅介绍RuleRuntimeEventManager

KieRuntimeEventManager

2.RuleRuntimeEventManager

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

RuleRuntimeEventManager

Drools 还提供DebugRuleRuntimeEventListenerDebugAgentaEventListener,通过调试打印语句实现每个方法。

示例

//添加 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时,将触发此方法。AgendaGroupdrl中的一个逻辑分组,它可以包含多个规则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开源业务规则引擎&#xff08;三&#xff09;- 事件模型&#xff08;Event Model&#xff09;1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My…...

智慧校园行政办公升级,日程监控不可或缺

在智慧校园的行政办公场景下&#xff0c;日程监控功能扮演了一个核心协调者的角色&#xff0c;它细腻地编织起时间管理的网络&#xff0c;确保各项活动与任务在井然有序中高效推进。这一功能通过以下几个方面&#xff0c;展现了其在提升工作效率与团队协作方面的独特价值。 首先…...

RedHat运维-Linux SSH基础3-sshd守护进程

1. sshd这个守护进程提供了OpenSSH服务&#xff0c;请问可以通过编辑哪些配置文件&#xff0c;来配置这个服务呢&#xff1f;________________________ 2. sshd这个守护进程提供了OpenSSH服务&#xff0c;请问可以通过编辑哪些配置文件&#xff0c;来配置这个服务呢&#xff1f…...

医院产科信息化管理系统源码,智慧产科管理系统,涵盖了从孕妇到医院初次建档、历次产检、住院分娩、统计上报到产后42天全部医院服务的信息化管理。

医院产科信息化管理系统源码&#xff0c;智慧产科管理系统&#xff0c;产科专科电子病历系统 技术架构&#xff1a;前后端分离Java&#xff0c;Vue&#xff0c;ElementUIMySQL8.0.36 医院产科信息化管理系统&#xff0c;通过构建专科病例系统实现临床保健一体化&#xff0c;涵…...

Softmax作为分类任务中神经网络输出层的优劣分析

Softmax作为分类任务中神经网络输出层的优劣分析 在深度学习领域&#xff0c;Softmax函数作为分类任务中神经网络的输出层&#xff0c;被广泛应用并展现出强大的优势。然而&#xff0c;任何技术都有其两面性&#xff0c;Softmax函数也不例外。本文将从多个角度深入分析Softmax…...

404白色唯美动态页面源码

404白色唯美动态页面源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 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未授权访问&#xff0c;默认情况下自动创建不存在的数据库&#xff0c;从而导致未授权访问。各种未授权访问的教程&#xff0c;但是它怎么封堵呢&#xff1f; -ifExists 很简单&#xff0c;启动参数添加 -ifExists &#xff0c;它的含义&#xff1a…...

基于java+springboot+vue实现的药店管理系统(文末源码+Lw)285

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;药品信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…...

网络爬虫基础

网络爬虫基础 网络爬虫&#xff0c;也被称为网络蜘蛛或爬虫&#xff0c;是一种用于自动浏览互联网并从网页中提取信息的软件程序。它们能够访问网站&#xff0c;解析页面内容&#xff0c;并收集所需数据。Python语言因其简洁的语法和强大的库支持&#xff0c;成为实现网络爬虫…...

js数组方法归纳——push、pop、unshift、shift

以下涉及到的数组的四个基础方法均会改变原数组!!! 1、 push() 该方法可以向数组的末尾添加一个或多个元素&#xff0c;并返回数组的新的长度可以将要添加的元素作为方法的参数传递&#xff0c;这样这些元素将会自动添加到数组的末尾该方法会将数组新的长度作为返回值返回 //创…...

VPN是什么?

VPN&#xff0c;全称Virtual Private Network&#xff0c;即“虚拟私人网络”&#xff0c;是一种在公共网络&#xff08;如互联网&#xff09;上建立加密、安全的连接通道的技术。简单来说&#xff0c;VPN就像是一条在公共道路上铺设的“秘密隧道”&#xff0c;通过这条隧道传输…...

浅析DDoS高防数据中心网络

随着企业业务的持续拓展和数智化转型步伐的加快&#xff0c;数据中心已逐渐演变为企业数据存储、处理和应用的关键部署场地&#xff0c;这也使得数据中心面临着日益严峻的网络安全风险&#xff0c;其中DDoS攻击以其高效性依旧是数据中心面临的主要威胁之一。伴随着数智化的发展…...

《安全行业大模型技术应用态势发展报告(2024)》

人工智能技术快速迭代发展&#xff0c;大模型应用场景不断拓展&#xff0c;随着安全行业对人工智能技术的应用程度日益加深&#xff0c;大模型在网络安全领域的应用潜力和挑战逐渐显现。安全行业大模型技术的应用实践不断涌现&#xff0c;其在威胁检测、风险评估和安全运营等方…...

【基于R语言群体遗传学】-4-统计建模与算法(statistical tests and algorithm)

之前的三篇博客&#xff0c;我们对于哈代温伯格遗传比例有了一个全面的认识&#xff0c;没有看的朋友可以先看一下前面的博客&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 1.一些新名词 &#xff08;1&#xff09;Algorithm: A series of operations executed in a s…...

Java springboot校园管理系统源码

Java springboot校园管理系统源码-014 下载地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89364089 技术栈 运行环境&#xff1a;jdk8 tomcat9 mysql5.7 windows10 服务端技术&#xff1a;Spring Boot Mybatis VUE 使用说明 1.使用Navicati或者其它工…...

Lianwei 安全周报|2024.07.01

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 出于安全考虑&#xff0c;拜登下令禁用卡巴斯基杀毒…...

柯桥职场英语学习商务英语口语生活英语培训生活口语学习

辣妹用英语怎么说&#xff1f; 辣妹在英语中通常被翻译为“hot girl”或“spicy girl”&#xff0c;但更常见和直接的是“hot chick”或简单地使用“hot”来形容。 举个例子: Shes a real hot girl with her trendy outfit and confident attitude. 她真是个辣妹&#xff0…...

Spring与Quartz整合

Quartz框架是一个轻量级的任务调度框架&#xff0c;它提供了许多内置的功能&#xff0c;包括&#xff1a;支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下&#xff1a; …...

C++之static关键字

文章目录 前提正文多重定义extern关键字使用staticstatic 全局变量(在.cpp文件中定义)static变量存放在哪里static变量可不可以放在.h文件中 static 函数static局部变量static 成员变量static 成员函数 总结参考链接 前提 好吧&#xff0c;八股&#xff0c;我又回来了。这次想…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...