当前位置: 首页 > 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;我又回来了。这次想…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...