Drools用户手册翻译——第四章 Drools规则引擎(十五)复杂事件处理(CEP)查询、事件监听、调试日志和性能调优

news2025/2/24 23:48:14

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

 

Drools查询和实时查询

你可以将查询和Drools引擎一起使用,这样就可以根据在规则中使用的事实模式去检索事实集合。模式也可以使用可选参数。

使用查询和Drools,你需要在DRL文件中添加查询的定义,然后在应用代码中获取匹配的结果。当查询遍历结果集时,你可以使用任意绑定到查询的标识符访问相关的事实或属性,通过带有绑定的变量名作为参数调用get方法。如果绑定的是一个事实对象的引用,你可以通过调用geyFactHandle方法检索事实处理,将变量名作为参数。

图示13. QueryResults

图示14. QueryResultsRow

在DRL中的查询定义

query "people under the age of 21"
    $person : Person( age < 21 )
end

 获得和遍历查询结果的代码

QueryResults results = ksession.getQueryResults( "people under the age of 21" );
System.out.println( "we have " + results.size() + " people under the age of 21" );

System.out.println( "These people are under the age of 21:" );

for ( QueryResultsRow row : results ) {
    Person person = ( Person ) row.get( "person" );
    System.out.println( person.getName() + "\n" );
}

当您监视随时间变化时,通过遍历返回的集合来调用查询和处理结果可能很困难。 使用持续查询来降低困难程度,drools提供了实时查询,实时查询使用附加的监听器来监听事件的改变,而不是遍历返回的结果集。实时查询通过创建一个视图来维持打开状态,并为这个视图推送更改事件。

要激活实时查询,请使用参数开始查询并监控结果视图中的更改。 您可以使用dispose()方法终止查询并停止此反应式场景。

在DRL文件中的查询定义

query colors(String $color1, String $color2)
    TShirt(mainColor = $color1, secondColor = $color2, $price: manufactureCost)
end

使用事件监听和实时查询的代码

final List updated = new ArrayList();
final List removed = new ArrayList();
final List added = new ArrayList();

ViewChangedEventListener listener = new ViewChangedEventListener() {
 public void rowUpdated(Row row) {
  updated.add( row.get( "$price" ) );
 }

 public void rowRemoved(Row row) {
  removed.add( row.get( "$price" ) );
 }

 public void rowAdded(Row row) {
  added.add( row.get( "$price" ) );
 }
};

// Open the live query:
LiveQuery query = ksession.openLiveQuery( "colors",
                                          new Object[] { "red", "blue" },
                                          listener );
...
...

// Terminate the live query:
query.dispose()

获取更多关于实时查询的例子,请看

http://blog.athico.com/2010/07/glazed-lists-examples-for-drools-live.html

Drools的事件监听和调试日志

Drools会在插入事实和规则执行时产生事件。如果你注册了事件监听器,当执行活动时Drools会调用每一个监听器。

事件监听器对不同的活动类型有不同的方法关联。Drools会给每个方法传递一个事件对象,这个对象包含指定活动的信息。

你的代码可以实现自定义的事件监听器,你也可以添加和移除注册的事件监听器。用这种方式,你的代码可以被Drools活动通知,并且你可以将日志和审计工作从你的引用代码里分离。

Drools引擎支持使用下面的方法的事件监听器

议程事件监听器

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);
}

规则运行监听器

public interface RuleRuntimeEventListener extends EventListener {
    void objectInserted(ObjectInsertedEvent event);
    void objectUpdated(ObjectUpdatedEvent event);
    void objectDeleted(ObjectDeletedEvent event);
}

关于事件类的定义,看

https://github.com/kiegroup/drools/tree/7.59.0.Final/drools-core/src/main/java/org/drools/core/event

Drools包含这些监听类的默认实现:DefaultAgendaEventListener和DefaultRuleRuntimeEventListener。你可以继承这些实现来监控指定的事件。

例如,下面的代码继承了DefaultAgendaEventListener来监视AfterMatchFireEvent事件并且将这个监听器连接到会话上。当规则启动时,代码会打印模匹配的模式:

在议程中监控并打印AfterMatchFireEvent事件的代码

ksession.addEventListener( new DefaultAgendaEventListener() {
   public void afterMatchFired(AfterMatchFiredEvent event) {
       super.afterMatchFired( event );
       System.out.println( event );
   }
});

Drools为调试日志也包含下面的议程和规则运行时事件监听器:

  • DebugAgendaEventListener

  • DebugRuleRuntimeEventListener

这些监听器实现了相同的支持事件监听器方法并默认包含一个调试打印语句。你可以为指定支持事件添加额外的监控代码。

例如,下面的代码使用DebugRuleRuntimeEventListener事件监听器去监控和打印所有的工作内存(规则运行时)事件“

监控并打印所有工作内存事件的代码

ksession.addEventListener( new DebugRuleRuntimeEventListener() );

事件监听器的开发实践

Drools在规则处理期间调用事件监听。这些调用会阻止Drools的执行。因为事件监听会影响Drools的性能。

为了将监听的影响降低至最小,请遵循下面的指导:

  • 任何操作必须尽可能的短。

  • 监听器类必须没有状态。Drool可以在任意时间摧毁和重建监听器类。

  • 不要使用依赖不同监听器的执行顺序的逻辑

  • 不在要监听器内与Drools之外的不同实体进行交互。例如,时间的通知不要包含REST调用。日志的输出可以,但是日志监听器必须尽可能的短

  • 你可以使用监听器修改Drools的状态,例如,改变变量的值。

在Drools中配置日志

Drools使用Java的日志APISLF4J作为系统日志。你可以使用下面日志工具中的一种,用于故障排查和数据收集:

  • Logback

  • Apache Commons Logging

  • Apache Log4j

  • java.util.logging package

过程

对于你想要使用的日志工具,在Maven工程中添加相关的依赖,或者在你的Drools包中的org.drools中保存相关的XML配置文件:

Logback的Maven依赖示例

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>

在org.drools包中的logback.xml配置示例

<configuration><logger name="org.drools" level="debug"/>
  ...
<configuration>

在org.drools包中的log4j.xml配置示例

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><category name="org.drools"><priority value="debug" /></category>
  ...
</log4j:configuration>

如果你正在开发一个超级轻量级的环境,可以使用slf4j-nop或者slf4j-simple logger。

Drools性能调优的注意事项

下面的关键概念和建议实践可以帮你优化Drools的性能。为了方便起见,本章节的总结了这些概念,并在交叉引用文档中做了更加详细的解释。这一节将会根据Drools新版的需要进行扩展或者更改。

对于Drools的重要更新没有需求的无状态会话使用顺序模式

在Drools中,顺序模式是高级规则库配置,顺序模式让Drools按顺序一次性的评估规则,这些规则是Drools议程列表中的规则,忽略工作内存中的修改。因此,顺序模式下的规则执行可能更快,但是重要的更新可能不会被用到你的规则中去,顺序模式只用于无状态的会话。

开启顺序模式,设置系统属性drools.sequential为true。

获取更多关于顺序模式的信息或者其他开启他的选择,请看“Phreak中的顺序模式”章节了解.

使用事件监听器进行简单操作

限制事件监听器的数量和监听器执行的操作类型。对简单操作使用事件监听器,比如调试日志和设置属性。监听器中的复杂操作,比如网络调用,会阻碍规则执行。当你用会话完成了工作之后,移除附加的事件监听器,以便让会话可以被清除,展示代码如下:

Listener listener = ...;
StatelessKnowledgeSession ksession = createSession();
try {
    ksession.insert(fact);
    ksession.fireAllRules();
    ...
} finally {
    if (session != null) {
        ksession.detachListener(listener);
        ksession.dispose();
    }
}

为可执行模型构建配置LambdaIntrospector的缓存大小

你可以在可执行模型构建中配置LambdaIntrospector.methodFingerprintsMap缓存的大小。默认的大小是32。当你为缓存配置较小的值时,会减少内存的使用。例如,你可以配置系统属性drools.lambda.introspector.cache.size为0,以实现最小的内存使用。注意,较小的缓存也可能会降低构建性能。

对可执行模型使用lambda外部化

  在运行期间使用lambda外部化可以优化内存的使用。lambda外部化会重写lambda,这些lambda是生成和可执行模型上使用的lambda。这个外部化能够在所有模式和星通的约束下重用lambda多次。当rete或phreak被实例化时,可执行模型变得可以收集垃圾。

  要为可执行模型启用lambda外部化,请包含以下属性:

-Ddrools.externaliseCanonicalModelLambda=true

配置alpha节点范围下标阈值

  Alpha节点范围下标用于评估规则限制。你可以使用系统属性(drools.alphaNodeRangeIndexThreshold)配置alpha节点范围下标的阈值。默认阈值是9,表示当先前节点包含超过九个具有不等式约束的alpha节点时,启用alpha节点范围索引。比如,当你有九条类似于Person(age>10),Person(age>20),...,Person(age>90)这样的规则时,你可以有9个类似的alpha节点。

  阈值的默认值是根据相关的优势和开销。但是,如果你为阈值配置了一个相对较小的值时,则可以根据您的规则提高性能。 比如,你可以配置drools.alphaNodeRangeIndexThreshold为6,当先例节点的alpha节点超过六个时启用alpha节点范围索引。您可以根据您的规则的性能测试结果为阈值设置一个合适的值。

启用连接节点范围索引

  连接节点范围索引功能仅在有大量事实要连接时才会提高性能,例如256*16组合。当您的应用程序插入大量事实时,您可以启用连接节点范围索引并评估性能改进。默认情况下,连接节点范围索引被禁用。

  示例kmodule. xml文件

<kbase name="KBase1" betaRangeIndex="enabled">

  BetaRangeIndexOption的系统属性

drools.betaNodeRangeIndexEnabled=true

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

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

相关文章

瑞数信息《2023 API安全趋势报告》重磅发布: API攻击持续走高,Bots武器更聪明

如今API作为连接服务和传输数据的重要通道&#xff0c;已成为数字时代的新型基础设施&#xff0c;但随之而来的安全问题也日益凸显。为了让各个行业更好地应对API安全威胁挑战&#xff0c;瑞数信息作为国内首批具备“云原生API安全能力”认证的专业厂商&#xff0c;近年来持续输…

pve7.2虚拟机 lvm磁盘扩容,增加硬盘操作

之前安装pve时候只有256的ssd,最近安装的虚拟机较多&#xff0c;给加块闲置硬盘&#xff0c;顺便学习一下&#xff0c;像pve这种虚拟机系统&#xff0c;硬盘应该可以像nas你这样随时增加&#xff0c;而不影响上层应用&#xff0c;我自己也是摸索着做。 一、安装好硬盘后打开pv…

对于企业:数字化的趋势不可阻挡.以无代码开发实现敏捷交付

在科技日新月异的今天&#xff0c;我们正处在一个由数据驱动的时代。为了在这个时代中占据一席之地&#xff0c;我们需要不断探索新的开发模式&#xff0c;以适应不断变化的市场需求。其中&#xff0c;无代码开发模式正逐渐成为引领未来科技的关键。 一、什么是无代码开发 无代…

2023年市面上最受欢迎的工程项目管理软件推荐

随着科技的发展和工程项目的复杂性增加&#xff0c;工程项目管理软件成为了现代项目管理中不可或缺的工具。这些软件可以帮助团队更好地协调、组织和执行工程项目&#xff0c;并提高项目的效率和成功率。本文结合了不同的产品测评网站&#xff0c;总结了以下四款备受好评的工程…

LabVIEW控制通用工作台

LabVIEW控制通用工作台 用于教育目的的计算机化实验室显着增长&#xff0c;特别是用于运动控制的实验室。它们代表了各种工业应用中不断扩大的领域&#xff0c;并成为以安全的方式使用通常昂贵或独特的实验室设备进行实时实验的宝贵工具。NI LabVIEW等软件应用程序的开发和不断…

甘特图:项目管理软件的应用,让项目团队提高工作效率

项目管理软件可以帮助项目团队更有效地分配资源、监控进度、降低风险&#xff0c;提高工作效率。 通过利用项目管理软件的强大功能&#xff0c;团队可以更好地应对项目中的各种挑战&#xff0c;确保项目按计划推进并实现项目目标。 任务分解&#xff1a;通过项目管理软件进…

uni-app项目运行在安卓真机调试

uni-app项目运行在安卓真机调试 手机开启开发者模式 在系统设置——关于手机——连续点击系统版本号5-7次&#xff0c;直到提示“您已处于开发者模式”。具体如下图&#xff1a; 手机开启USB调试 在系统和更新——开发人员选项——打开USB调试。具体如下图所示&#xff1a…

【HCIP】重发布实验2

题目 拓扑图 配置&#xff1a; R1 //ip配置 [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/0]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 14.1.1.1 24 //配置RIP和OSPF并且实现…

学习笔记|printf函数的实现|不同操作系统中的换行|数的进制:2进制、10进制、16进制转换|STC32G单片机视频开发教程(冲哥)|第五集:C语言基础

文章目录 1.C语言 printf函数的实现Tips&#xff1a;ASCII码表Tips&#xff1a;找不到头文件怎么办&#xff1f;主函数添加程序:常规用法:Tips&#xff1a;不同操作系统中的换行 ⒉数的进制:2进制、10进制、16进制.常见的对应&#xff1a; 1.C语言 printf函数的实现 printf 是…

创新零售,京东重新答题?

继新一轮组织架构调整后&#xff0c;京东从低价到下沉动作不断。 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合。近日&#xff0c;京喜拼拼已改名为京东拼拼&#xff0c;与七鲜、前置仓等业务共同承载起京东线上线下加速融合的梦想。 同时&#xff0c;拼拼的更…

自定义element-plus的弹框样式

项目中弹框使用频繁,需要统一样式风格,此组件可以自定义弹框的头部样式和内容 一、文件结构如下: 二、自定义myDialog组件 需求&#xff1a; 1.自定义弹框头部背景样式和文字 2.自定义弹框内容 3.基本业务流程框架 components/myDialog/index.vue完整代码&#xff1a; &…

Kubernetes(K8s)入门

一、Kubernetes是什么 Kubernetes是什么? 首先&#xff0c;它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然还很新&#xff0c;但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果。确切地说&#xff0c;Kubernetes是谷歌严格保密十几年的…

hutool 导出复杂表头excel

假如已这样的表头导出数据 1.把包含表头的excel添加到项目资源目录 2.编写代码读取表头所在sheet,并且加入需导出的数据 /*** 导出excel*/public static void downloadExcel(List<List<Object>> list, HttpServletResponse response) throws IOException {/*Strin…

应用案例|基于三维机器视觉的机器人纸箱拆码垛应用解决方案

Part.1 项目背景 在现代物流和制造行业中&#xff0c;纸箱的拆码垛操作是一项重要且频繁的任务。传统的纸箱拆码垛工作通常由人工完成&#xff0c;这种方式存在劳动强度大、生产效率低以及人为操作容易导致错误等问题&#xff0c;严重影响物料的安全运输和质量。为了满足物流行…

无涯教程-Perl - lock函数

描述 此函数将咨询锁放在共享变量或THING中包含的引用对象上,直到该锁超出范围。 lock()是一个"弱关键字":这意味着,如果您在调用该函数之前已通过该名称定义了该函数,则将改为调用该函数。 语法 以下是此函数的简单语法- lock THING返回值 此函数不返回任何值…

操作系统搭建相关知识

系统篇 systemctl命令 常用于重启系统的每个服务&#xff0c;例如重启系统的网络&#xff0c;使用restart参数!!! 网络篇 ifconfig命令 注意&#xff1a;如果有过多块网卡&#xff0c;例如&#xff1a;eth0和eth1网卡&#xff0c;一般查看那个参数上面带有RUNNING和UP网卡开…

字节跳动推出公共DNS服务,将支持 DoH/DoT/DoQ 等协议

近日&#xff0c;字节跳动旗下的火山引擎正式上线 TrafficRoute 解析调度套件&#xff0c;其实质就是一套“公共 DNS”服务&#xff0c;目前仅支持免费版。该 DNS 后续将提供 DoH、DoT 和 DoQ 加密 DNS 查询协议。 火山引擎公共解析&#xff08;PublicDNS&#xff09;产品介绍&…

Unity UI.Image 六边形+流光 Shader

效果图 参考代码 Shader"Custom/HexFlowImage" {Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) "white" {}_Color ("Tint", Color) (1,1,1,1)_StencilComp ("Stencil Comparison", Float) 8_Stencil (…

Ebay跨境电商静电空气净化器亚马逊UL867测试标准

“室内空气净化装置”是一种耗能产品&#xff0c;用于减少密闭空间内的空气污染物浓度&#xff0c;包括 但不限于过敏原、微生物&#xff08;如细菌、真菌、病毒及其他微生物&#xff09;、尘埃、颗粒、烟气、 雾气、气体或蒸汽以及有味化学物质等。此类产品包括但不限于&#…

绕过 open_basedir

在ctfshow 72遇到的 open_basedir 所以进行学习 https://www.cnblogs.com/hookjoy/p/12846164.html#:~:text%E5%8F%AA%E6%98%AF%E7%94%A8glob%3A,%E8%83%BD%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E3%80%82 上面是师傅的文章 我就跟着复现一下 0x01 首先了解…