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

news2024/11/23 9:44:35

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

 

对于事件的时间操作

在流模式中,drools对插入到工作内存的事件支持下面的时间操作。你可以使用操作符去定义你生命在java类或者DRL规则文件中的时间推理行为。当Drools在云模式下运行时,是不支持时间操作的。

  • after

  • before

  • coincides

  • during

  • includes

  • finishes

  • finished by

  • meets

  • met by

  • overlaps

  • overlapped by

  • starts

  • started by

after

这个操作指定是否当前事件发生在相关事件之后,这个操作可以定义当前事件在相关事件发生之后的多久发生,或者是在某个时间范围内发生。

例如,下面模式匹配$eventA在$eventB结束之后的3分30秒到4分钟之间启动。如果超过这个时间范围,则不会发生模式匹配。

$eventA : EventA(this after[3m30s, 4m] $eventB)

可以如下面这样表达:

3m30s <= $eventA.startTimestamp - $eventB.endTimeStamp <= 4m

after操作支持2个参数值:

  • 如果两个数都被定义,则第一个值代表时间间隔的开始,第二个代表结束。

  • 如果只有一个值被定义,代表时间间隔的开始,并且没有结束时间。

  • 如果没有值被定义,代表时间间隔从1毫秒开始,并且没有结束时间。

after操作也支持负时间范围:

$eventA : EventA(this after[-3m30s, -2m] $eventB)

 如果第一个值比第二个值大,Drools会自动将这两个值反过来。例如,下面的两个匹配会被Drools以相同的方式解析。

$eventA : EventA(this after[-3m30s, -2m] $eventB) $eventA : EventA(this after[-2m, -3m30s] $eventB)

before

这个操作指定当前事件在相关事件发生之前发生。这个操作和after一样也定义了时间和时间范围。

例如,下面的模式匹配,$eventA在$eventB发生之前的3分半和4分钟之间发生。如果不在这个时间范围内,则匹配失败。

$eventA : EventA(this before[3m30s, 4m] $eventB)

也可以用下面的方式表达这个操作:

3m30s <= $eventB.startTimestamp - $eventA.endTimeStamp <= 4m

before操作支持两个参数:

如果两个值都被定义了,代表时间间隔的开始时间和结束时间。

如果只定义了一个值,代表时间间隔的开始时间,没有结束时间。

如果没有定义值,代表时间间隔的开始时间是1毫秒,没有结束时间。

before操作也支持负时间范围:

$eventA : EventA(this before[-3m30s, -2m] $eventB)

如果第一个值大于第二个值,Drools1会自动将两个参数反过来,例如,下面的两种情况,Drools1会用相同的方式解析:

$eventA : EventA(this before[-3m30s, -2m] $eventB) $eventA : EventA(this before[-2m, -3m30s] $eventB)

 coincides

这个操作指定两个事件同时发生,有相同的开始和结束时间。

例如,下面这个形式就是$eventA和$eventB的时间戳相同:

$eventA : EventA(this coincides $eventB)

这个操作支持两个参数:

如果只给了1个参数,参数用于设置两个事件的开始和结束时间的阈值。

如果两个参数都给了,第一个用于开始时间的阈值,第二个用于结束时间的阈值。

下面就是用了开始和结束时间阈值的例子:

$eventA : EventA(this coincides[15s, 10s] $eventB)

 如果满足以下条件,则模式匹配:

abs($eventA.startTimestamp - $eventB.startTimestamp) <= 15s && abs($eventA.endTimestamp - $eventB.endTimestamp) <= 10s

Drools对于coincides操作中不支持负时间间隔,如果你使用了负时间间隔,会产生错误。 

during

这个操作指定当前事件发生在相关时间开始和结束时间范围之内。当前事件必须在相关事件开始之后才能开始,在相关事件结束之前,必须结束。

例如,下面的模式匹配:

$eventA : EventA(this during $eventB)

也可以用下面的操作表达:

$eventB.startTimestamp < $eventA.startTimestamp <= $eventA.endTimestamp < $eventB.endTimestamp

during操作支持一个,两个或者四个可选参数:

  • 如果只定义了一个参数,这个值就是开始和结束时间的最大间隔。

  • 如果定义了两个参数,这两个值是一个阈值,当前时间发生的开始和结束时间和相关事件的开始结束时间相关。例如,如果参数是5和10,则表示,当前事件必须在相关事件启动后的5到10秒之间启动,在相关事件结束前的5到10秒之间结束。

  • 如果定义了4个参数,第一个和第二个值是事件开始与结束时间的最小和最大距离,第三个和第四个值是两个事件的结束最小与最大距离。

includes

这个操作符是指定相关事件发生是否在当前事件发生的时间内发生。相关事件的开始必须在当前事件开始之后,相关事件结束,必须在当前事件结束之前。(这个操作和during操作正好是反过来的)。

例如,下面的模式匹配,$eventB在$eventA开始后开始,在$eventA结束前结束。

$eventA : EventA(this includes $eventB)

也可以用下面的方式表达:

$eventA.startTimestamp < $eventB.startTimestamp <= $eventB.endTimestamp < $eventA.endTimestamp

includes操作支持1个,2个和四个可选参数:

  • 如果只有一个值被定义,这个值就是两个事件开始时间的最大时间距离,结束时间的最大时间距离。

  • 如果定义了两个值,就是两个事件开始时间间隔的时间范围,和结束时间间隔的范围。例如,如果两个参数是5和10,则表示在当前事件开始之后的5到10秒之间,相关事件必须开始,在当前事件结束之前的5到10秒之间,相关事件必须结束。

  • 如果定义了四个值,则第一和第二个值代表两个事件开始时间的最小间隔和最大间隔,第三和第四个值代表两个事件结束时间的最小间隔和最大间隔。

finishes

此运算符指定当前事件在相关事件之后开始,但两个事件同时结束。

例如,下面的模式匹配,$eventA在$eventB开始之后开始,但是却同时结束:

$eventA : EventA(this finishes $eventB)

你也可以像下面这样表达:

$eventB.startTimestamp < $eventA.startTimestamp && $eventA.endTimestamp == $eventB.endTimestamp

这个操作只支持一个参数,设置两个事件结束时间允许的最大时间差:

$eventA : EventA(this finishes[5s] $eventB)

如果这个条件满足,模式匹配:

$eventB.startTimestamp < $eventA.startTimestamp && abs($eventA.endTimestamp - $eventB.endTimestamp) <= 5s

finished不支持负时间差距,如果你使用负时间间距,Drools会产生错误。

finished by

这个操作是相关事件在当前事件开始之后开始,然后一起结束。(这个操作行为是finishes的反过来的操作)

例如,下面的模式匹配就是$eventA开始后$eventB开始,然后一起结束:

$eventA : EventA(this finishedby $eventB)

你也可以像下面这样表达

$eventA.startTimestamp < $eventB.startTimestamp && $eventA.endTimestamp == $eventB.endTimestamp

这个操作也是只支持一个参数,两个事件结束时间间隔的最大值:

$eventA : EventA(this finishedby[5s] $eventB)

如果这个条件满足,这个模式就会匹配:

$eventA.startTimestamp < $eventB.startTimestamp && abs($eventA.endTimestamp - $eventB.endTimestamp) <= 5s

finished不支持负时间差距,如果你使用负时间间距,Drools会产生错误。

meets

这个操作是当前事件结束,与此同时,相关事件开始。

例如,下面这个模式匹配,$eventA结束的同时,$eventB开始:

$eventA : EventA(this meets $eventB)

你也可以用下面的方式表达该操作:

abs($eventB.startTimestamp - $eventA.endTimestamp) == 0

该操作也只有一个可选参数,表示当前事件结束时间和相关事件开始时间中间的最大时间间隔:

$eventA : EventA(this meets[5s] $eventB)

如果这些条件满足,则模式匹配:

abs($eventB.startTimestamp - $eventA.endTimestamp) <= 5s

finished不支持负时间差距,如果你使用负时间间距,Drools会产生错误。

met by

这个操作是相关事件结束,当前事件开始。(该操作正好与meet相反。)

距离,如果eventB结束的同时evnetA开始,则模式匹配。

$eventA : EventA(this metby $eventB)

也可以用下面的表达这个操作:

abs($eventA.startTimestamp - $eventB.endTimestamp) == 0

该操作也只有一个可选参数,表示相关事件结束时间和当前事件开始时间中间的最大时间间隔:

$eventA : EventA(this metby[5s] $eventB)

如果这些条件满足,则模式匹配:

abs($eventA.startTimestamp - $eventB.endTimestamp) <= 5s

finished不支持负时间差距,如果你使用负时间间距,Drools会产生错误。

overlaps

这个操作就是当前事件在相关事件开始之前开始,当前事件的结束在相关事件的开始时间与结束时间之间。

例如,如果eventA在eventB开始之前开始,在eventB开始之后,结束之前,eventA结束,则会匹配:

$eventA : EventA(this overlaps $eventB)

该操作支持两个参数:

  • 如果只有一个参数,这个值就是相关事件的开始时间与当前事件的结束时间的最大时间差。

  • 如果有两个参数,第一个值是相关事件的开始时间与当前事件的结束时间的最小时间差,第二个是相关事件的开始时间与当前事件的结束时间的最大时间差。

overlapped by

该操作是相关事件开始在当前事件开始之前,相关事件的结束在当前事件开始和结束之间。(和overlaps正好相反)。

例如,如果eventB在eventA开始之前开始,然后eventB结束当eventA开始,在eventA结束之前,下面的模式匹配:

$eventA : EventA(this overlappedby $eventB)

该操作支持两个参数:

  • 如果只有一个参数,这个值就是当前事件的开始时间与相关事件的结束时间的最大时间差。

  • 如果有两个参数,第一个值是当前事件的开始时间与相关事件的结束时间的最小时间差,第二个是当前事件的开始时间与相关事件的结束时间的最大时间差。

starts

这个操作是两个事件同时开始,但是当前事件要在相关事件结束之前结束。

例如,如果eventA和eventB同时开始,eventA先结束,eventB后结束,则下面的模式会被匹配:

$eventA : EventA(this starts $eventB)

也可以用下面的方式表达这个操作:

$eventA.startTimestamp == $eventB.startTimestamp && $eventA.endTimestamp < $eventB.endTimestamp

starts操作支持一个参数,代表两个事件的开始时间的最大差距:

$eventA : EventA(this starts[5s] $eventB)

如果这些条件满足,则模式匹配:

abs($eventA.startTimestamp - $eventB.startTimestamp) <= 5s && $eventA.endTimestamp < $eventB.endTimestamp

finished不支持负时间差距,如果你使用负时间间距,Drools会产生错误。

started by

这个操作是两个事件同时开始,但是相关事件在当前事件结束之前结束。(与starts操作行为相反)

例如,如果eventA和eventB同时开始,eventB先结束,eventA后结束,则下面的模式会被匹配:

$eventA : EventA(this startedby $eventB)

也可以用下面的方式表达这个操作:

$eventA.startTimestamp == $eventB.startTimestamp && $eventA.endTimestamp > $eventB.endTimestamp

该操作操作支持一个参数,代表两个事件的开始时间的最大差距:

$eventA : EventA( this starts[5s] $eventB)

如果这些条件满足,则模式匹配:

abs( $eventA.startTimestamp - $eventB.startTimestamp ) <= 5s && $eventA.endTimestamp > $eventB.endTimestamp

finished不支持负时间差距,如果你使用负时间间距,Drools会产生错误。

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

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

相关文章

Python数据分析实战-dataframe指定多列去重(附源码和实现效果)

实现功能 Python数据分析实战-利用df.drop_duplicates(subset[,])对dataframe指定多列去重 实现代码 import pandas as pddata{state:[1,1,2,2,1,2,2],pop:[a,b,c,d,b,c,d]} framepd.DataFrame(data)frameframe.drop_duplicates(subset[pop,state]) print(frame) 实现效果 本…

【SpringCloud】RabbitMQ基础

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;…

Unity Git项目添加子模块

在 当前仓库根目录下执行命令 git submodule add https://github.com/xxx/child.git 检查仓库状态 git status 更新子库 git submodule update --remote 下拉父仓库Git并保住子库也更新 git pull --recurse-submodules 推荐使用 Githubdesktop工具 这样你可以更清楚的看到自己…

前端如何设置表单元素的默认值?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文本框、文本域⭐ 单选按钮、复选框⭐ 对于下拉列表⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是…

全网最强,Jmeter性能测试-web接口性能压测总结(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 压测的目的 对于…

b站视频标题的获取(xpath、jsonpath的一个简单应用)

目录 1.目的2.代码的演示 注&#xff1a;该篇文章为本人原创&#xff0c;由于本人学习有限&#xff0c;若有错误或者笔误或者有问题&#xff0c;欢迎大家进行批评指正&#xff0c;谢谢。 1.目的 在b站大学上&#xff0c;为了更好的写笔记&#xff0c;本人根据学到的Python(即Py…

2. 内存分区模型

一、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&a…

【JVM】垃圾回收 ——自问自答2

Q: System.gc() 的理解 System.gc()底层调用的是 Runtime.getRuntime.gc(),会现实出发FullGC。 但是&#xff0c;它的调用附带一个免责声明&#xff0c;无法保证对垃圾收集器的调用。 Q&#xff1a; 内存溢出和内存泄漏&#xff1f; 内存溢出&#xff1a; 简而言之&#xf…

泊松损坏图像的快速尺度间小波去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

最新ChatGPT网站源码运营版+支持ai绘画(Midjourney)+GPT4.0+GPT官方3.5key绘画+实时语音识别输入+后台一键版本更新!

最新ChatGPT网站源码运营版支持ai绘画GPT4.0GPT官方3.5key绘画实时语音识别输入后台一键版本更新&#xff01; 1.网站系统源码介绍&#xff1a; 程序已支持ChatGPT4.0、Midjourney绘画、GPT3.5 API绘画、语音识别输入、用户会员套餐用户每日签到功能后台管理一键更新版本。支…

docker中的jenkins去配置sonarQube

docker中的jenkins去配置sonarQube 1、拉取sonarQube macdeMacBook-Pro:~ mac$ docker pull sonarqube:8.9.6-community 8.9.6-community: Pulling from library/sonarqube 8572bc8fb8a3: Pull complete 702f1610d53e: Pull complete 8c951e69c28d: Pull complete f95e4f8…

【代码随想录-LeetCode第一题】二分查找及实现

LeetCode刷题第一题&#xff1a;704二分查找法 什么是二分查找&#xff1f;题目思路和边界问题 参考 代码随想录 什么是二分查找&#xff1f; 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的查找算法。它通过将目标值与数组的中间元素进行比…

配置虚拟机中常见问题

1.Centos8的问题 用root运行宝塔官方一键安装脚本&#xff0c;结果报错了&#xff0c;提示&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist&#xff1b; 出现原因&#xff1a; CentOS 8在2022年12月31日将迎来到生命周期终点&#xff0c;…

Spring Boot集成EasyPoi实现导入导出操作

文章目录 Spring Boot集成EasyPoi实现导入导出操作0 简要说明1 环境搭建1.1 项目目录1.2 依赖管理2.3 关于swagger处理2.4 关于切面处理耗时1 自定义注解2 定义切面类3 如何使用 2.5 核心导入操作2.6 核心导出操作 2 最佳实线2.1 导入操作1 实体类说明2 业务层3 效果3 控制层 2…

前端工程师的摸鱼日常(19)

【图为恐子真身】 史记记载恐子九尺六寸高&#xff0c;根据春秋的尺度换算&#xff0c;有一米九至两米多高&#xff0c;人皆畏之。 一米九的山东大汉&#xff0c;手下七十二堂口&#xff08;帮派&#xff09;、三千门生&#xff08;小弟&#xff09;。 由他弟子所编写的《抡…

【数学建模学习(10):遗传算法】

遗传算法简介 • 遗传算法&#xff08;Genetic Algorithms&#xff09;是基于生物进化理论的原理发展起来的一种广为 应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之 间的信息交换&#xff0c;搜索不依赖于梯度信息。它是20世纪70年代初期由美国…

MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图

文章目录 WM_SIZE应用通过WM_SIZE消息实现窗口布局管理通过控件属性实现窗口布局管理 CFrameWnd类CFrameWnd类简介OnCreate和OnCreateClient的方法注册时的要素与窗口设置PreCreateWindow创建窗口的预处理函数 附录预处理函数的结构体CFrameWnd::LoadFrame与CreateFrame WM_SIZ…

K8S系列文章之 Traefik快速入门

traefik 与 nginx 一样&#xff0c;是一款优秀的反向代理工具&#xff0c;或者叫 Edge Router。至于使用它的原因则基于以下几点 无须重启即可更新配置自动的服务发现与负载均衡与 docker 的完美集成&#xff0c;基于 container label 的配置漂亮的 dashboard 界面metrics 的支…

周末在家值班,解决几个月前遗忘的Bug

问题&#xff1a; 周末被迫在家值班&#xff0c;无聊之际打开尘封已久的Bug清单&#xff0c;发现有Bug拖了几个月还没解决… 场景是这样子的&#xff0c;有个功能是拿Redis缓存热点数据进行展示&#xff0c;暂且称它为功能A&#xff0c;有个另外的功能B&#xff0c;它会去更新缓…

(文章复现)建筑集成光储系统规划运行综合优化方法matlab代码

参考文献&#xff1a; [1]陈柯蒙,肖曦,田培根等.一种建筑集成光储系统规划运行综合优化方法[J].中国电机工程学报,2023,43(13):5001-5012. 1.基本原理 本文建立的双层耦合模型内、外层分别对应求解容量配置与能量调度问题。外层模型设置光伏与储能容量备选集并将容量配置组合…