<p>Drools Fusion既是规则引擎,又可以作为CEP。除了<a href="/2013/12/21/event_in_CEP.html" title="事件定义">事件定义</a>和<a href="/2013/12/21/Temporal_of_CEP.html" title="时间推理">时间推理</a>之外,对于引擎本身也会有一些不同的使用。主要体现在会话时钟、流模式、滑动窗口和对事件的内存管理。</p>

会话时钟

由于事件的时间性,处理事件时需要一个参考时钟。

这个参考时钟在会话配置(KnowledgeSessionConfiguration)中指定,所以称为会话时钟(Session Clock)。

有很多种场景需要对时钟进行控制,比如:

  • 规则测试

    测试总是需要一个可控的环境,并且当测试包含了带有时间约束的 规则时,不仅需要控制输入规则和事实,而且也需要时间流。

  • 定期(regular)执行

    通常,在运行生产规则时,应用程序需要一个实时时 钟,允许引擎对时间的行进立即作出反应。

  • 特殊环境

    特殊环境可以对时间的控制有特殊的要求。群集环境可能需要在心 跳中的时钟同步,或 JEE 环境可能需要使用一个应用服务器提供的时钟,等 等。

  • 规则重演或模拟

    要重演场景或模拟场景也需要应用程序控制时间流。

Drools中默认使用基于系统时钟的实时时钟(realtime),也可以使用能被应用程序控制的伪时钟(pseudo)。设置伪时钟的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
conf.setOption( ClockTypeOption.get( "pseudo" ) );

StatefulKnowledgeSession session =kbase.newStatefulKnowledgeSession( conf, null );

SessionPseudoClock clock = session.getSessionClock();

// then, while inserting facts, advance the clock as necessary:
FactHandle handle1 = session.insert( tick1 );
clock.advanceTime( 10, TimeUnit.SECONDS );
FactHandle handle2 = session.insert( tick2 );
clock.advanceTime( 30, TimeUnit.SECONDS );
FactHandle handle3 = session.insert( tick3 );

流模式

Drools默认运行在云(Cloud)模式下。云模式下没有时间流的概念,引擎知道所有的事实(Fact)和事件(Event)。此时引擎将所有的事实/事件看做是一个无序的云。

由于云模式下引擎没有“现在”的概念,尽管事件具有时间戳、期限等元数据,这些数据也仅仅作为事件的属性,

不代表事件发生的顺序,也不能进行

如果需要处理实时/准实时事件(Event),需要时间推理,Drools必须工作在流(Stream)模式下。

此时要求每个流中的事件必须按照时间顺序插入。

启用流模式

Drools默认运行在云模式下,可以通过以下方式启用流模式:

1
2
3
KnowledgeBaseConfiguration config =
KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );

也可以使用属性文件定义:drools.eventProcessingMode = stream

入口点

Drools定义了工作空间的多个入口点(WorkingMemoryEntryPoint),每个入口点可以看做是一个事件流,可以将事件通过不同的入口点插入到工作空间中。

来自同一个入口点的事件通过时间戳被排序。每个流既可以包含单一类型的事件,也可以包含多种类型的事件。

  • 声明入口点

    入口点不需要显式声明,在规则中引用的入口点都会在规则编译期间被自动识别和创建。比如:

1
2
3
4
5
6
7
rule "authorize withdraw"
when
WithdrawRequest($ai : accountId,$am : amount ) from entry-point "ATM Stream"
CheckingAccount( accountId ==$ai, balance >$am )
then
// authorize withdraw
end

规则编译器会识别"ATM Stream"入口点,并在规则库中创建该入口点。

  • 使用入口点

    举例如下:

1
2
3
4
5
6
7
// create your rulebase and your session as usual
StatefulKnowledgeSession session = ...
// get a reference to the entry point
WorkingMemoryEntryPoint atmStream =
session.getWorkingMemoryEntryPoint( "ATM Stream" );
// and start inserting your facts into the entry point
atmStream.insert( aWithdrawRequest );

除了这种手工插入事实的方式之外,Drools还提供了一系列的管道API和适配器,可以将其他流(如JMS、IO流、Socket等)之间接入到入口点上。

滑动窗口

在流模式中,规则的LHS部分

可以使用滑动窗口限定只关注一定范围内的事件。这个范围可以是时间或事件的个数,分别成为滑动时间窗口和滑动长度窗口。

比如:

1
2
3
4
5
6
7
8
9
10
11
StockTick() over window:time( 2m )

Number( doubleValue >$max ) from accumulate(
SensorReading($temp : temperature ) over window:time( 10m ), average($temp )
)

StockTick( company == "IBM" ) over window:length( 10 )

Number( doubleValue >$max ) from accumulate(
SensorReading($temp : temperature ) over window:length( 100 ), average($temp )
)

内存管理

在流模式下,引擎自动执行事件的内存管理。对于不可能再被匹配的事件自动释放。

引擎会关注事件的@expires中指定的到期时间,并分析规则中隐含的到期时间,进行自动释放。

原文地址:http://holbrook.github.io/2013/12/22/from_rule_to_cep.html

</div>

从规则引擎到复杂事件处理(CEP)的更多相关文章

  1. Flink/CEP/规则引擎/风控

    基于 Apache Flink 和规则引擎的实时风控解决方案 ​ 对一个互联网产品来说,典型的风控场景包括:注册风控.登陆风控.交易风控.活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后三 ...

  2. 【java规则引擎】drools6.5.0版本中kmodule.xml解析

    kmodule.xml文件存放在src/main/resources/META-INF/文件夹下. <?xml version="1.0" encoding="UT ...

  3. 大数据计算引擎之Flink Flink CEP复杂事件编程

    原文地址: 大数据计算引擎之Flink Flink CEP复杂事件编程 复杂事件编程(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的时事件系序列库,并 ...

  4. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析

    转载至:https://blog.csdn.net/wo541075754/article/details/75004575 3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法 ...

  5. 《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析

    3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KS ...

  6. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  7. Asp.net 面向接口可扩展框架之业务规则引擎扩展组件

    随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...

  8. Atitit.工作流 与 规则引擎

    Atitit.工作流 与 规则引擎 1.1. 应用来说,通常分为三部分:界面.业务逻辑和存储1 1.2. 自定义操作系列1 1.3. 自定义按钮系列2 1.1. 应用来说,通常分为三部分:界面.业务逻 ...

  9. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

随机推荐

  1. Qt: error lnk1158 无法运行rc.exe

    解决办法:(依据自己的环境而定) 将C:\Program Files (x86)\Windows Kits\\bin\10.0.15063.0\x64 目录下的rc.exe 和rcdll.dll 复制 ...

  2. Ajax--art-template + 调用天气接口

    一.实现原理: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  3. ubuntu安装verilog

    1.安装verilog sudo apt-get install verilog 2.安装gtkwave sudo apt-get install gtkwave 3.安装dinotrace(和gtk ...

  4. ORACLE 使用笔记

    ORACLE TRUNC()函数 TRUNC():类似截取函数,按指定的格式截取输入的数据. 1.[trunc(for dates)]TRUNC()函数处理日期 语法格式:TRUNC(date[,fm ...

  5. loadrunner分析之-网页、网络、资源分析

    在Web Page Diagnostics(网页分析)中当在场景中打开Diagnostics菜单下的Web Page Diagnostics功能,就能得到网页分析组图.通过这个图,可以对事务的组成进行 ...

  6. 实现一个vue的图片预览插件

    vue-image-swipe 基于photoswipe实现的vue图片预览组件 安装 1 第一步 npm install vue-image-swipe -D 2 第二步 vue 入口文件引入 im ...

  7. 通用、封装、简化 webpack 配置

    通用.封装.简化 webpack 配置 现在,基本上前端的项目打包都会用上 webpack,因为 webpack 提供了无与伦比强大的功能和生态.但在创建一个项目的时候,总是免不了要配置 webpac ...

  8. HTML5拖放API实现拖放排序的实例代码

    想要拖放某个元素,必须设置该元素的 draggable 属性为 true,当该属性为 false 时,将不允许拖放.而 img 元素和 a 元素都默认设置了 draggable 属性为 true,可直 ...

  9. log4j日志系统

    在项目开发中,记录错误日志是一个很有必要功能.一是方便调试:二是便于发现系统运行过程中的错误:三是存储业务数据,便于后期分析: 在java中,记录日志,有很多种方式. 比如,自己实现. 自己写类,将日 ...

  10. BootstrapValidation一些tips

    BootstrapValidation一些tips:1. callback的用法 如果你有一些特别的检查需要,比如两个元素必需有一个有值,你可以在两个元素上加上callback,例:sel和cb必需有 ...