Drools用户手册翻译——第四章 Drools规则引擎(十)复杂事件处理(CEP)

news2024/11/19 13:24:22

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。  

 

目录

​编辑

复杂事件处理(CEP)

CEP中的事件

将事实声明为事件

Drools的事件处理模式

流模式中的负模式


复杂事件处理(CEP)

在Drools中,事件是记录,记录了领域在某个时间点的状态的改变。根据领域的建模方式,状态的改变可能被一个单独事件代表,也可能被很多原子事件代表,或者相关事件的层次结构代表。从复杂事件处理角度来看,事件是事实或对象的一种类型,事件发生在某些特定的时间点,业务规则是对来自事实和对象数据如何反映的定义。例如:股票经纪人应用中,证券价格的变化,买卖关系的变化,或者账户持有人余额的变化都被认为是事件,因为在给定时间点上,应用程序的状态发生了变化。

Drools使用CEP来监测和处理事件集合中的多事件,发现事件之间存在的关系,并且从事件和他们的关系中推断出新的数据。

CEP用例和业务规则用例共享若干需求和目标。

从业务的角度出发,业务规则的定义通常基于事件触发的场景来定义。在下面的例子中,事件形成根据业务规则的基础:

  • 在一个算法交易应用中,如果证券价格高于开盘价格百分之X以上,则规则执行操作。在股票交易应用中,价格上涨被标记为事件。

  • 在一个监控应用中,如果服务器机房的温度在Y分钟内增长了X摄氏度,则规则执行操作。传感器的示数被标记为事件。

从技术角度来看,业务规则评估和CEP有下列相似之处:

  • 业务规则评估和CEP都需要和企业基础设施和应用无缝集成,这一条对于生命周期管理,审计和安全尤其重要。

  • 业务规则评估和CEP都有函数需求,例如模式匹配,还有无函数需求,例如响应时间限制和查询规则解释

CEP场景具有以下特征:

  • 通常用来处理大量事件,但是只有少量事件是相关的。

  • 时间通常是不变的,并且代表状态改变的记录。

  • 规则和查询针对事件运行,并且必须对检测出的事件模式做出反应

  • 先关事件通常拥有很强的时间关系

  • 单条事件没有优先级。CEP系统会优先考虑相关事件的模式以及他们之间的关系

  • 事件通常需要被组合与聚合

鉴于这些普通CEP场景特点,Drools的CEP系统支持下面的特性和功能,优化了事件处理:

  • 用合适的语义处理事件

  • 事件监测,关联,聚合和组合

  • 事件流处理

  • 时间约束建模事件之间的时间关系

  • 重大事件的滑动窗口

  • 会话范围的统一时钟

  • CEP用例所需要的事件量

  • 反应性规则

  • 用于将事件输入到Drools的适配器(管道)

CEP中的事件

在Drools中,事件是应用领域在某个时间点上,对于状态的重大变化的记录。根据领域建模,状态的改变被一个单独事件,多个原子事件,或者相关事件的层次代表。从CEP视角来看,时间是事实或对象在某个特定时间点的类型,业务规则是定义了如何对事实或对象中的数据做出反应。举例来说,在股票经纪人应用中,证券价格的改变,买卖关系的改变,或者账户持有者的改变都被认为是事件,因为在某个给定的时间点,引用领域的状态发生了改变。

事件拥有下面的主要特征:

  • 不变性:事件是过去某个时间点发生变化的记录,因此不能改变。

Drools不会对代表事件的java对象强制不变。此行为可能会使事件数据变得丰富。你的应用应该能够填充未填充事件的属性,并且这些属性被Drools用于丰富推断数据的事件。但是,如果事件属性已经被填充之后,你不应该修改事件属性。

  • 有很强的时间限制: 涉及事件的规则要求多事件关联,这些事件彼此相关,发生在不同的时间点上。

  • 生命周期管理:因为事件是不变的和有时间限制的,所以他们通常只在指定的时间段内关联。这就意味着Drools能够自动管理事件的生命周期。

  • 可以使用滑动窗口:可以定义事件定义时间和长度的滑动窗口。滑动的时间窗口是指可以处理事件的特定时间段。滑动长度窗口是指能够被处理的事件数量。

将事实声明为事件

在Java类或者DRL规则文件中可以声明事实作为时间,所以Drools在处理CEP时将事实作为事件处理。你可以将事实作为internal-based事件或者point-in-time事件。Internal-base事件有持续时间,并且会被保存到Drools的工作内存中,直到持续时间结束。Point-in-time事件没有持续时间,本质上是持续时间为0的internal-based事件。

过程

对于在java类和Drl规则文件中的相关事实类型,输入元数据标签@role(event)和参数。元数据标签@role接收下面两个值:

  • fact:(默认)声明作为相关事实的类型

  • event:声明作为事件的类型

例如,下面代码段在股票经纪人应用中声明了StockPoint的事实类型,该类型必须作为事件被处理:

声明事实类型为事件

import some.package.StockPoint

declare StockPoint
  @role( event )
end

如果StockPoint是在DRL规则文件中声明的事实类型,而不是之前就存在的类,你可以现声明事件:

现声明事实类型并赋予其事件的角色

declare StockPoint
  @role( event )

  datetime : java.util.Date
  symbol : String
  price : double
end

Drools的事件处理模式

Drools既可以在云模式下运行,也可以在流模式下运行。在云模式下,Drools处理事实,按照没有时间限制,与时间无关,并且没有特定顺序的事实来处理。在流模式下,Drools处理事实,按照强时间限制,实时或近实时的事件来处理。流模式使用异步使事件处理成为可能。

云模式下,下面的需求不会引入:

  • 没有时钟同步,因为没有时间概念

  • 事件无序,因为引擎处理事件,是将事件当做无序云处理的,无序云就是Drools匹配规则的对象。

可以通过设置系统属性在相关的配置文件中指定云模式,也可以通过使用Java客户端的API:

使用系统属性设置云模式:

drools.eventProcessingMode=cloud

使用java客户端API设置云模式

import org.kie.api.conf.EventProcessingOption;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices.Factory;

KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();

config.setOption(EventProcessingOption.CLOUD);

可以在kmodule.xml文件中使用KIE库属性eventProcessingMode="<mode>"指定云模式

<kmodule>
  ...
  <kbase name="KBase2" default="false" eventProcessingMode="cloud" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1">
    ...
  </kbase>
  ...
</kmodule>

流模式

流模式按时间顺序处理事件,并且是按照插入的顺序实时处理的。在流模式下,Drools同步事件流(以便不同的流中能够按时间顺序处理),实现时间或长度的滑动窗口,并且启动自动生命周期管理。

下面的需求应用于流模式:

  • 每一个流中的事件都要按时间排序。

  • 同步事件流必须有会话时钟存在。

你的应用不需要再流之间强制事件的顺序,但是使用没有同步的事件流有可能会引起意想不到的结果

可以通过设置系统属性在相关的配置文件中指定流模式,也可以通过使用Java客户端的API:

drools.eventProcessingMode=stream

 使用java客户端API设置云模式

import org.kie.api.conf.EventProcessingOption;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices.Factory;

KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();

config.setOption(EventProcessingOption.STREAM);

可以在kmodule.xml文件中使用KIE库属性eventProcessingMode="<mode>"指定流模式

<kmodule>
  ...
  <kbase name="KBase2" default="false" eventProcessingMode="stream" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1">
    ...
  </kbase>
  ...
</kmodule>

流模式中的负模式

负模式是不满足条件的模式,例如,如果检测到火灾且未激活洒水器,以下DRL规则将激活火灾警报:

rule "Sound the alarm"
when
  $f : FireDetected()
  not(SprinklerActivated())
then
  // Sound the alarm.
end

在云模式下,Drools假设所有事实(常规事实和事件)都是预先知道的,并且立即评估负模式。流模式下,Drools只是对事实的时间约束,用来等待激活规则之前的设置时间。

相同的例子在流模式下激活报警是一样的,但是会延迟10秒。

使用负模式的火警警报和时间延迟(只有流模式下)

rule "Sound the alarm"
when
  $f : FireDetected()
  not(SprinklerActivated(this after[0s,10s] $f))
then
  // Sound the alarm.
end

下面修改的火警规则期望每十秒发生一个心跳事件。如果期望的时间没有发生,则规则会被执行。这个规则使用了在第一个模式和负模式中相同的对象类型。负模式有时间约束,在执行之前等待0到10秒,并且排除绑定到$h的心跳事件,以便规则可以执行。绑定事件$h必须显式排除,为了规则能够执行,因为时间约束不会排除并在此匹配。

在负模式中排除绑定事件的火警规则(只流模式)

rule "Sound the alarm"
when
  $h: Heartbeat() from entry-point "MonitoringStream"
  not(Heartbeat(this != $h, this after[0s,10s] $h) from entry-point "MonitoringStream")
then
  // Sound the alarm.
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java课题笔记~ Mybatis注解开发

使用注解开发&#xff0c;可以减少Mapper映射文件的编写。 一、mybatis常用注解 Insert&#xff1a;实现新增 Update&#xff1a;实现更新 Delete&#xff1a;实现删除 Select&#xff1a;实现查询 Result&#xff1a;实现结果集封装 Results&#xff1a;可以与Result 一…

23款奔驰GLB200升级23P智能驾驶辅助系统,提升您的行车安全性

为什么要升级23P驾驶辅助系统呢&#xff1f;23P驾驶辅助系统功能有什么作用呢&#xff1f; 首先23P驾驶辅助系统功能有9个&#xff0c;相互结合让行车更安全&#xff0c;长途开车更轻松。提升驾驶的安全性。 所以选择装这套23P驾驶辅助系统的用户也比较多&#xff0c;现在道路…

屏蔽箱的种类、优点及使用场景介绍

屏蔽箱的用途是非常广泛的&#xff0c;能够屏蔽辐射电磁也可以阻隔电磁进入某一区域&#xff0c;达到屏蔽干扰信号的作用。屏蔽箱的种类是多样的&#xff0c;有着各自的优点。 按照应用领域屏蔽箱可分为以下几种&#xff1a; 1.电磁屏蔽箱&#xff1a;主要应用于电磁波测试和电…

【Jmeter】压测mysql数据库中间件mycat

目录 背景 环境准备 1、下载Jmeter 2、下载mysql数据库的驱动包 3、要进行测试的数据库 Jmeter配置 1、启动Jmeter图形界面 2、加载mysql驱动包 3、新建一个线程组&#xff0c;然后如下图所示添加 JDBC Connection Configuration 4、配置JDBC Connection Configurati…

洛谷P1918 保龄球

思路&#xff1a;要打多少个就在哪里打 比如要打100个&#xff0c;就在a数组中找出一个100&#xff0c;在那里打 所以可以用STL-map。 map大法好&#xff01;&#xff01;&#xff01; 用map存储每种 瓶子个数 最后出现的位置。 就是说&#xff0c;比如样例中&#xff1a;…

[C++项目] Boost文档 站内搜索引擎(2): 文档文本解析模块parser的实现、如何对文档文件去标签、如何获取文档标题...

项目开始的准备工作 在上一篇文章中, 已经从Boost官网获取了Boost库的源码. 相关文章: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍… 接下来就要编写代码了. 不过还需要做一些准备工作. 创建项目目录 所有的项目文件肯定要在一…

DTCC2023第十四届中国数据库大会分享:MySQL性能诊断平台:利用eBPF技术实现高效的根因诊断

主题 8月16-18日 DTCC2023第十四届中国数据库大会在北京国际会议中心召开&#xff0c;17日下午在云原生数据库开发与实践分论坛&#xff0c;我将带来分享&#xff1a;《MySQL性能诊断平台&#xff1a;利用eBPF技术实现高效的根因诊断》敬请期待&#xff01; 欢迎大家提前试用我…

深度学习Redis(5):集群

前言 在前面的文章中&#xff0c;已经介绍了Redis的几种高可用技术&#xff1a;持久化、主从复制和哨兵&#xff0c;但这些方案仍有不足&#xff0c;其中最主要的问题是存储能力受单机限制&#xff0c;以及无法实现写操作的负载均衡。 Redis集群解决了上述问题&#xff0c;实…

【积累】安装PLSQL工具遇到的那些问题~

报错提示没有正确安装 解决方案&#xff1a;是需要安装oracle client oracle下载地址&#xff1a;https://www.oracle.com/database/technologies/oracle-database-software-downloads.html 报错提示确认安装了32位的Oracle Client吗&#xff1f; 百度找解决方案&#xff1a…

Execution failed for task ‘:app:uploadCrashlyticsMappingFileRelease

新版本的Firebase crash 库打混淆后的正式环境包会报错&#xff1a; Execution failed for task :app:uploadCrashlyticsMappingFileRelease Caused by: java.lang.IllegalArgumentException: Host name may not be empty 解决方案&#xff1a; 在build.gradle android{}中…

如何编写一个易于维护的考试系统源码

编写一个易于维护的考试系统源码对于开发人员来说非常重要。一个易于维护的系统可以使代码更易于理解、修改和扩展&#xff0c;从而提高开发效率和系统稳定性。 第一步&#xff1a;良好的项目结构 良好的项目结构是一个易于维护的源码的基础。可以按照模块、功能或层次等方式…

uniapp 中过滤获得数组中某个对象里id:1的数据

// 假设studentData是包含多个学生信息的数组 const studentData [{id: 1, name: 小明, age: 18},{id: 2, name: 小红, age: 20},{id: 3, name: 小刚, age: 19},{id: 4, name: 小李, age: 22}, ]; // 过滤获取id为1的学生信息 const result studentData.filter(item > ite…

使用aidegen导入AOSP工程到Clion并配置toolchains

作者&#xff1a;Season3266 一、aidegen介绍 aidegen是AOSP中自带的一个工具&#xff0c;可以将源码中的某个工程导入进IDE&#xff0c;从而可以使用IDE的智能提示&#xff0c;提高编码效率。而源码中的工程并不是独立存在的&#xff0c;还会依赖其他工程中的各种模块&#x…

虚拟机技术

基础知识 虚拟机技术 虚拟机就是通过软件在宿主机上虚拟出一台计算机。虚拟机技术是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实体结构间的不可切割的障碍&#…

随笔--向量数据库的检索算法

文章目录 暴力搜索&#xff08;Flat&#xff09;聚类近似最近邻算法&#xff1a;ANN局部敏感哈希索引&#xff1a;LSH存储优化&#xff1a;&#xff08;量化&#xff09;聚类码本乘积量化索引&#xff1a;PQ层次导航小世界&#xff1a;HNSW 暴力搜索&#xff08;Flat&#xff0…

如何用cpolar创建隧道,实现外网访问内网?

如何用cpolar创建隧道&#xff0c;实现外网访问内网&#xff1f; 文章目录 如何用cpolar创建隧道&#xff0c;实现外网访问内网&#xff1f; 在安装和调试完本地的cpolar后&#xff0c;我们终于可以接触到cpolar的核心功能&#xff1a;建立一条专属于自己的数据通道&#xff0c…

dirsearch Web目录扫描器使用手册-新手入门指南

声明&#xff1a;该系列文章首发于公众号&#xff1a;Y1X1n安全&#xff0c;转载请注明出处&#xff01;本公众号所分享内容仅用于每一个爱好者之间的技术讨论及教育目的&#xff0c;所有渗透及工具的使用都需获取授权&#xff0c;禁止用于违法途径&#xff0c;否则需自行承担&…

纯css实现登录表单动效

效果图&#xff1a; 代码展示 // 我这边用的是elementUI表单校验&#xff0c;更改的样式。 <el-form:model"form":rules"rules"ref"fromList":hide-required-asterisk"true"><el-form-item prop"account"><…

vim粘贴内容格式混乱解决方法

问题 复制本地文件内容后&#xff0c;咱贴到vim文本内&#xff0c;格式错乱 解决方法 打开vim配置文件 最后面加入一行 vim /etc/vimrc set pastetoggle<F11> 开发vim文件&#xff0c;进入后先按F11进入交互模式 shift insert 再次粘贴 解决

c语言野指针int*p、空指针int*p = NULL、万能指针void* p

1、野指针&#xff0c;既没有初始化的指针&#xff0c;//如果没有给指针初始化&#xff0c;则指针p的内容为随机地址&#xff0c;会随机指向&#xff0c;故成为野指针&#xff0c;不可以操作野指针 #include "stdio.h" #include <stdlib.h>int main() {//1、野…