Drools用户手册翻译——第四章 Drools规则引擎(十三)复杂事件处理(CEP)会话时钟,事件流和切入点

news2024/9/29 21:31:34

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

 

目录

会话时钟的实现

事件流和切入点

为规则数据声明切入点


会话时钟的实现

在复杂事件处理期间,事件可能会有时间约束,因为需要一个会话时钟,用来提供当前的时间。例如,如果规则需要决定过去一个小时的某个给定股票的平均价格,Drools必须能够用会话中的当前时间比较股票价格的事件的时间戳。

Drools支持实时时钟和伪时钟。你可以根据场景使用一个或两个时钟类型:

  • 规则测试:测试需要控制环境,并且当测试包含使用时间约束的规则,你必须能够控制输入的规则、事实和时间流。

  • 定期执行:Drools会实时对事件作出反应,因此需要一个实时时钟。

  • 指定环境:指定环境可能会有指定时间控制需求。例如,聚类环境可能需要时钟同步或者JEE环境可能需要应用服务器通过的时钟。

  • 规则重播或模拟:为了重播或模拟场景,应用必须能够控制时间流。

根据你的环境需求来决定是否使用实时时钟或者伪时钟。

实时时钟

实时时钟是默认时钟,使用的是系统时钟作为时间戳。配置Drools使用实时时钟,设置KIE会话配置参数为realtime:

配置实时时钟代码如下:

import org.kie.api.KieServices.Factory;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.api.runtime.KieSessionConfiguration;

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();

config.setOption(ClockTypeOption.get("realtime"));

伪时钟

伪时钟是为了辅助测试时间规则,伪时钟可以被应用控制。配置Drools使用伪时钟,设置KIE会话配置参数为pseudo:

配置伪时钟代码如下:

import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.KieServices.Factory;

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();

config.setOption(ClockTypeOption.get("pseudo"));

你也可以使用额外的配置和事实处理控制伪时钟:

在会话中控制伪时钟

import java.util.concurrent.TimeUnit;

import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.KieServices.Factory;
import org.kie.api.runtime.KieSession;
import org.drools.core.time.SessionPseudoClock;
import org.kie.api.runtime.rule.FactHandle;
import org.kie.api.runtime.conf.ClockTypeOption;

KieSessionConfiguration conf = KieServices.Factory.get().newKieSessionConfiguration();

conf.setOption( ClockTypeOption.get("pseudo"));
KieSession session = kbase.newKieSession(conf, null);

SessionPseudoClock clock = session.getSessionClock();

// 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可以用事件流的形式处理大量事件。在DRL规则文件中声明,流也被成为切入点。当你在DRL规则文件或者java应用中声明了切入点,Drools会在编译时会识别和创建适当的内部规则,用来使用切入点的数据去评估规则。

一个切入点的事实或流可以连接来自任意其切入点的事实,除了已经在工作内存中的事实。事实总是会和他们进入的切入点关联。相同类型的事实可以通过不同的切入点进入Drools,但是通过切入点A进入的事实不会与切入点B的模式匹配。

事件流有下面的特点:

  • 流中的时间会按时间排序。虽然时间戳在不同的流中可能有不同的语义,但是他们总是内部排序的。

  • 事件流通常会有大量的事件。

  • 流中的原子事件通常单独没有用,只在流中集合时才有用。

  • 事件流可以是同构的,包含单一事件类型,或者异构,包含各种不同类型的事件。

为规则数据声明切入点

你可以为事件声明一个切入点(事件流),好让Drools只用来自切入点的数据评估规则。你可以在DRL规则文件中通过引用隐式声明切入点,也可以在java程序中显式声明切入点。

过程

使用下面方法之一声明切入点

  • 在DRL规则文件,为插入的事实指定from entry-point "<name>"

使用"ATM流"切入点授权提现规则

rule "Authorize withdrawal"
when
  WithdrawRequest($ai : accountId, $am : amount) from entry-point "ATM Stream"
  CheckingAccount(accountId == $ai, balance > $am)
then
  // Authorize withdrawal.
end

应用带有"分支流"切入点的费用规则

rule "Apply fee on withdraws on branches"
when
  WithdrawRequest($ai : accountId, processed == true) from entry-point "Branch Stream"
  CheckingAccount(accountId == $ai)
then
  // Apply a $2 fee on the account.
end

银行系统的两个示例中的DRL规则都是插入了带有CheckingAccount事实的WithdrawalRequest事件,但是是从不同的切入点插入的。在运行时,Authorize withdrawal规则只会用ATM Stream切入点的数据来评估,而Apply fee规则只会用Branch Stream切入点来评估。任何插入到ATM stream的事件都不会与Apply fee规则里面的模式匹配,同理,任何插入到Branch Stream的事件都不会与Authorize withdrawal rule规则匹配。

在Java应用代码里,使用getEntryPoint方法指定获取一个EntryPoint对象,同时将事实插入到该切入点中:

用java代码的切入点并插入事实

import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.EntryPoint;

// Create your KIE base and KIE session as usual.
KieSession session = ...

// Create a reference to the entry point.
EntryPoint atmStream = session.getEntryPoint("ATM Stream");

// Start inserting your facts into the entry point.
atmStream.insert(aWithdrawRequest);

任何指定了from entry-point Atm StreamDRL的规则,都只会根据这个切入点的数据进行评估。

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

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

相关文章

无货源无技术无专业做跨境电商?Live Market一站式服务助你出海

近年来&#xff0c;我国跨境电商发展取得可喜进展。商务部数据显示&#xff0c;跨境电商货物进出口规模占外贸比重由5年前的不足1%上升到目前的5%左右。越来越多的资本开始重视这一领域&#xff0c;越来越多的玩家开始布局。 然而&#xff0c;对于普通商家来说想要踏足跨境电商…

解决VtsHalLightTargetTest问题

一、问题描述&#xff1a; 二、解决方案&#xff1a; Date: Fri, 14 Jul 2023 11:14:31 0800 Subject: [PATCH] fix: 解决VtsHalLightTargetTest问题Description:依据报错修改代码Self Test:PassChange-Id: Ia0bca62480cd26845b285ae61c3d8264d8555d9a ---diff --git a/aidl/d…

软件开发项目文档清单(多套实际案例)

写在前面&#xff1a; 我花了一些时间整理了这些年从事软件行业以来的文档&#xff0c;将它们分类整理后&#xff0c;电脑瞬间变得更加简洁。我整理了数百份软件开发过程中的常用文档&#xff0c;包括项目计划、立项计划、需求分析、概要设计、详细设计、数据库设计、用户操作手…

mysql不用窗口函数,后面加一列序号

前言 在后端开发中最常用的数据库还是比较稳定的5.8&#xff0c;而窗口函数是只有在mysql8以上才有的&#xff0c;然后在开发中有个需要排序序号的需求&#xff0c;翻找资料&#xff0c;问AI得出结论可以实现。 列出方法 如果你使用的是MySQL 5.7版本&#xff0c;而没有窗口…

好的测试数据管理,到底要怎么做?

你的组织是否实施了测试数据管理&#xff1f;如果你的组织处理关键或敏感的业务数据&#xff0c;测试数据管理肯定会让组织受益。与测试数据相关的问题占所有软件缺陷的 15%&#xff0c;这一事实强调了测试数据的重要性。本文将准确讨论测试数据经理职责、测试数据经理需要什么…

【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带6

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

云服务器选什么系统

特网科技是一家领云计算服务提供商&#xff0c;拥有全球性服务&#xff0c;覆盖了超过200个国家和地区&#xff0c;提供多种不同的服务器操作系统&#xff0c;包括常见的Linux和Windows&#xff0c;以及一些非常特殊的OS&#xff0c;如FreeBSD和OpenSUSE。如何选择合适的操作系…

PCB状态字段细分,线程安全问题,加锁,synchronized

补充&#xff1a;之前的线程休眠 sleep &#xff0c;参数是以ms作为单位&#xff0c;但是sleep本身就存在一些误差。sleep(1000),不一定是精确在休眠1000ms&#xff08;线程的调度&#xff0c;也是需要时间的&#xff09; sleep&#xff08;1000&#xff09;的意思是说该线程在…

js案例:1.简单计算器

目录 一.效果图 二.实现思路 整体思路 ​ 1.关键是dom操作 ​ 2.设置点击事件 3.数据类型的隐式转换和赋值 三.完整代码 一.效果图 二.实现思路 整体思路 1.关键是dom操作 通过 document.getElementById(id) 获取html中的dom元素 每一个html标签都是一个对象&…

如何用看板让你的项目管理更上一层楼

项目管理的核心挑战 项目管理始终是一个充满挑战的领域。在多变的环境中&#xff0c;管理一个项目并确保其成功完成是一项巨大的任务。那么&#xff0c;为什么项目管理会如此复杂呢&#xff1f; 概述项目的复杂性 每一个项目都有其独特性&#xff0c;无论是项目的规模、团队…

centos 7 系统上重启 mysql 时报错 Failed to restart mysqld.service: Unit not found.

在 centos 7 系统上&#xff0c;使用常规命令&#xff1a;systemctl restart mysql 或 service mysqld restart 重启 mysql 时都会报如下错误&#xff1a; Failed to start mysqld.service: Unit not found. 根据所报错误&#xff0c;在网上搜罗了一圈&#xff0c;未果&#x…

跨境电商B2B2C多用户商城快速搭建(java开源+多语言)

跨境电商已经成为一种重要的商业模式。在跨境电商领域&#xff0c;B2B2C多用户商城是一种常见的商业模式&#xff0c;即面向商家和终端消费者的电商模式。这种模式下&#xff0c;多个商家可以在同一个电商平台上销售商品&#xff0c;终端消费者可以在该平台上购买商品。具体搭建…

【图像去噪的扩散滤波】基于线性扩散滤波、边缘增强线性和非线性各向异性滤波的图像去噪研究(Matlab代码实现)

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

React 入门学习

React 入门 一、基本认识1.1、前言1.2、什么是1.3、编译<br>1.4、特点1.5、高效 二、React环境和基本使用2.1、环境搭建2.2、脚手架项目基本使用2.2.1、src2.2.2、public2.2.3、package.json 三、JSX的理解和使用四、模块与模块化, 组件与组件化的理解4.1、模块与组件4.2…

自定义类型——枚举

枚举 1.枚举的定义 枚举顾名思义就是一一列举。将可能的取值一一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举。性别有&#xff1a;男、女、也可以一一列举。月份有12个月&#xff0c;也可以一一列举 像在这些场景中就可…

【数据结构】——栈、队列的相关习题

目录 题型一&#xff08;栈与队列的基本概念&#xff09;题型二&#xff08;栈与队列的综合&#xff09;题型三&#xff08;循环队列的判空与判满&#xff09;题型四&#xff08;循环链表表示队列&#xff09;题型五&#xff08;循环列表的入队和出队&#xff09; 题型一&#…

浅谈对属性描述符__get__、__set__、__delete__的理解

1、属性描述符的基础介绍 1.1 何为属性描述符&#xff1f; 属性描述符是一种Python语言中的特殊对象&#xff0c;用于定义和控制类属性的行为。属性描述符可以通过定义__get__、__set__、__delete__方法来控制属性的读取、赋值和删除操作。 通过使用属性描述符&#xff0c;可…

2.4G芯片做遥控颈部按摩器方案

颈部按摩器很受上班族的欢迎&#xff0c;具有仿真人揉捏按摩效果&#xff0c;多单位力度调节&#xff0c;舒缓因长时间工作紧绷的的肌肉。主控芯片使用宇凡微的2.4g合封芯片。 一、颈部按摩器方案介绍 颈部按摩器方案的工作原理&#xff0c;主要采用电机驱动按摩触头&#xff0…

3.5 C++ 纯虚函数、抽象类 3.6 依赖倒转原则

纯虚函数 class A { public:virtual void print(){cout<<"A"<<endl;}virtual void test()0; //纯虚函数 }; 一个类内有纯虚函数&#xff0c;这个类就叫抽象类&#xff1b; 抽象类不能实例化&#xff1b; <java、python&#xff1a…

掌握最新的测评补单技术,了解速卖通、虾皮平台的风控机制

想要销量好&#xff0c;免不了要进行测评补单的&#xff0c;因为不管对于哪一个平台的新店铺新产品而言&#xff0c;前期只靠自然流量是很难的&#xff0c;速卖通平台也一样&#xff01;那么速卖通平台要如何进行测评补单呢&#xff1f; 市面上有许多不同的测评系统&#xff0c…