首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从KieSession访问在DRL中创建的事实?

在Drools规则引擎中,KieSession 是执行规则和管理事实的核心接口。当你在 Drools 的决策表(DRL)文件中定义规则时,这些规则会在 KieSession 中执行,并且可以创建、修改或访问事实。

基础概念

  • KieSession:Drools 的工作单元,用于执行规则和管理事实。
  • DRL(Decision Rule Language):Drools 的规则定义语言,用于编写业务规则。

访问在 DRL 中创建的事实

要从 KieSession 访问在 DRL 中创建的事实,你可以使用以下方法:

  1. 插入事实:首先,你需要将事实插入到 KieSession 中。这可以通过调用 KieSession.insert(factObject) 方法来完成。

示例代码:

代码语言:txt
复制
KieSession kieSession = ...; // 获取 KieSession 实例
MyFact fact = new MyFact(); // 创建事实对象
kieSession.insert(fact); // 将事实插入到 KieSession
  1. 访问事实:一旦事实被插入到 KieSession,你就可以通过规则来访问和操作这些事实。规则可以读取事实的属性,调用事实的方法,甚至创建新的事实。

在 DRL 中访问事实的示例:

代码语言:txt
复制
rule "Example Rule"
when
    $fact : MyFact(property == "value")
then
    // 执行一些操作,例如打印事实信息
    System.out.println("Fact property: " + $fact.getProperty());
end
  1. 获取已插入的事实:如果你需要在规则执行后访问已插入的事实,可以使用 KieSession.getObjects() 方法来获取所有已插入的事实对象。然后,你可以根据需要对这些事实进行进一步处理。

示例代码:

代码语言:txt
复制
Collection<?> facts = kieSession.getObjects();
for (Object fact : facts) {
    if (fact instanceof MyFact) {
        MyFact myFact = (MyFact) fact;
        // 处理 MyFact 对象
    }
}

应用场景

这种机制在许多应用场景中都非常有用,例如:

  • 业务流程管理:根据业务规则自动处理事务。
  • 决策支持系统:基于规则和事实进行决策。
  • 数据验证:使用规则验证数据的有效性。

可能遇到的问题及解决方法

  1. 事实未找到:如果规则中没有匹配到任何事实,可能是因为事实没有正确插入到 KieSession 中,或者规则条件不正确。确保事实已插入,并检查规则条件是否准确。
  2. 并发问题:在多线程环境中使用 KieSession 时,可能会遇到并发问题。确保正确同步对 KieSession 的访问,或者考虑使用线程安全的 KieSession 实现。
  3. 性能问题:如果 KieSession 中包含大量事实,规则执行可能会变慢。优化规则和事实结构,或者考虑使用分页或其他技术来减少每次处理的事实数量。

希望这些信息能帮助你更好地理解和应用 Drools 规则引擎中的 KieSession 和 DRL。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

规则引擎Drools在贷后催收业务中的应用

本篇文章主要介绍了规则引擎的概念以及Kie和Drools的关系,重点讲解了Drools中规则文件编写以及匹配算法Rete原理。文章的最后为大家展示了规则引擎在催收系统中是如何使用的,主要解决的问题等。...Drools 引擎的工作内存中搜索与 DRL 文件中的规则相关的事实。...编译算法描述了如何处理生产内存中的规则以生成有效的决策网络。在非技术术语中,决策网络用于在数据通过网络传播时对其进行过滤。...创建KieSession会话链接创建AgendaFilter来制定执行某一个或某一些规则调用insert方法将事实对象fact插入工作内存调用fireAllRules方法执行规则最后调用dispose关闭连接四...最后结合催收系统给大家讲解了Drools在催收系统中是如何使用的。通过规则引擎的引入让开发人员不再需要参与到规则的开发与维护中来,极大节约了开发成本。

1.5K21

Spring Boot + 规则引擎Drools,强!

引入依赖 我们创建一个spring boot应用程序,pom中添加drools相关的依赖,如下: org.drools 创建KieFileSystem实例并配置规则引擎并从应用程序的资源目录加载规则的 DRL 文件。 使用KieBuilder实例来构建 drools 模块。...添加业务Model 创建一个订单对象OrderRequest,这个类中的字段后续回作为输入信息发送给定义的drools规则中,用来计算给定客户订单的折扣金额。...定义drools 规则 前面的DroolsConfig类中指定drools规则的目录,现在我们在/src/main/resources/rules目录下添加customer-discount.drl文件...这个drl文件虽然不是java文件,但还是很容易看懂的。 我们使用了一个名为orderDiscount 的全局参数,可以在多个规则之间共享。

2.3K20
  • drools规则动态化实践

    四、 drools动态化实践 从以上简单demo中我们可以看出,规则依赖drl文件存在。而业务实际使用中,需要动态对规则进行修改,无法直接使用drl文件。...示例如下: 上图中每个方块为一个缓冲池,每条连线为一条从A缓冲池流向B缓冲池的规则。实际场景中缓冲池有数百个,绝大多数都有自己的规则,这些规则构成一张复杂的网络。...我们在创建缓冲池的页面中加入了流向规则的创建环节。每个缓冲池维护自己的流向规则,即为自己的一根连线。...kieSession.insert(clueModel); kieSession.fireAllRules(); kieSession.dispose(); 在执行规则的过程中可以加入各种监听器对过程中各种变化进行监听...五、 总结 从上边的流程中我们体验了动态规则的创建以及使用。动态规则满足了我们规则动态变化,规则统一管理的诉求。 我也总结了在这种使用方式下drools的几个优缺点。

    54010

    《Drools7.0.0.Final规则引擎教程》Springboot+规则重新加载

    在《Drools7.0.0.Final规则引擎教程》之Springboot集成中介绍了怎样将Drools与Springboot进行集成,本篇博客介绍一下集成之后,如何实现从数据库读取规则并重新加载规则的简单...,其中需要注意的是对KieContainer和KieSession的初始化之后都将其设置到KieUtils类中。...KieUtils KieUtils类中存储了对应的静态方法和静态属性,供其他使用的地方获取和更新。...= kieSession; } } ReloadDroolsRules 提供了reload规则的方法,也是本篇博客的重点之一,其中从数据库读取的规则代码直接用字符串代替,读者可自行进行替换为数据库操作...操作步骤如下:启动项目访问http://localhost:8080/test/address 会首先触发默认加载的address.drl中的规则。

    2.8K70

    【猫头虎科技角】深入Drools:规则引擎的艺术与实践

    【猫头虎科技角】深入Drools:规则引擎的艺术与实践 摘要 在今天的高速发展的软件行业中,Drools作为一个高效、灵活的业务规则管理系统(BRMS),提供了一个桥梁,将复杂业务逻辑与应用程序代码分离...如何使用Drools? 安装和配置 首先,确保你的开发环境中安装了Java JDK。然后,你可以通过Maven或Gradle来添加Drools依赖到你的项目中。...Drools 集成Drools通常涉及到创建一个KieSession,它是一个可以向其中插入事实(Fact)和触发规则执行的会话。...A:是的,Drools支持在运行时更新规则,这为业务规则的动态调整提供了可能。 Q:Drools在性能方面如何?...参考资料 官方Drools文档 Java规则引擎开发实战 表格总结 核心知识点 说明 Drools基本概念 一种基于Java的业务规则管理系统 规则定义 使用DRL语言进行规则定义 应用程序集成 通过KieSession

    95110

    规则引擎之drools入门

    resources 目录下创建文件 helloworld.drl 文件,内容如下: package helloworld; rule "HelloWorld" when eval...规则名是规则的唯一标识,所以规则编写过程中需要保证它是不重复的。规则的条件(LHS)是按照 DRL 语言编写的,条件eval(true)表示永远为真,即该条规则总会获得执行。.../index.html#d0e4235 Drools 原理 DRL 解释执行流程 Drools 规则是在 Java 应用程序上运行的,其要执行的步骤顺序由代码确定。...如上图所示,每个规则条件分为小块,在树结构中连接和重用。每次将数据添加到规则引擎中时,它将在与此类似的树中进行求值,并到达一个动作节点,在该节点处,它们将被标记为准备执行特定规则的数据。...当我们到达一个事实(Fact)与规则相匹配的节点时,规则评估会将规则操作与触发数据添加到一个叫作议程(Agenda)的组件中,如果同一个事实(Fact)与多个规则相匹配,就认为这些规则是冲突的,议程(Agenda

    4.8K40

    【Drools二】打工人学习Drools基础语法

    后面将规则文件放入该文件夹中。 1. 规则文件 1.1 构成 在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl。...drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。...在更新数据时需要注意防止发生死循环。后面会讲到如何避免死循环即设置no-loop true 3.2 insert方法 insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配。...(); kieSession.dispose(); 通过控制台输出可以发现,只有第一个规则触发了,因为在第一个规则中将工作内存中的数据删除了导致第二个规则并没有匹配成功。...注意:上面的代码需要设置日期格式,否则我们在规则文件中写的日期格式和默认的日期格式不匹配程序会报错。

    2.1K20

    小明历险记:规则引擎Drools教程一

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。...在Drools的帮助下,您的应用程序变得非常可扩展。如果频繁更改请求,可以添加新规则,而无需修改现有规则。 知识集中化 通过使用规则,您创建一个可执行的知识库。这是商业政策的一个真理点。...Drools通过事实、规则和模式相互组合来完成工作,Drools在开源规则引擎中使用率最广,但是在国内企业使用偏少,保险、支付行业使用稍多。...解决小明的烦恼 Drools有专门的规则语法drl,就是专门描述活动的规则是如何执行的,按照小明的需求规则如下: Point-rules.drl 文件内容 package rules import com.neo.drools.entity.Order...这里需要有一个配置文件告诉代码规则文件drl在哪里,在Drools中这个文件就是kmodule.xml,放置到resources/META-INF目录下。 kmodule.xml内容如下: <?

    1.1K30

    这种场景你还写ifelse你跟孩子坐一桌去吧

    在初始化方法中,构建```KieServices.Factory.get();```,这个过程是比较耗费资源,实际业务使用中也不会频繁的构建。 2....从```KieServices```中获取```KieContainer```,用于给定KieModule的所有kiebase的容器。 3. 设置FACT对象,其实就是你的决策对象的一些条件值。...获取kmodule.xml中配置中名称为all-rules的session,默认为有状态的。 2. 设置决策对象```kieSession.insert(policy);``` 3....索引方法 索引方法是指对 Rete 网络的节点建立当前节点对后继 的索引,在事实断言时可以通过索引快速找到对应的后继节 点而无需逐个查找。 2....带时间信息的事件处理 Rete 通过事实来表达当前状态,但是很多应用包括一些事件流中的时间,在事件并行执行中起到关键作用。所以需要 Rete 算法对这些信息进行处理。 3.

    94350

    这种场景你还写ifelse你跟孩子坐一桌去吧

    只有合理的评估、铺垫、架设,才会不断满足业务需求、产品形态的变化。否则往后的路越来越难! 二、场景 对于上面所提到的这种场景,在我们实际开发中是经常会遇到的。...userParenting,英文逗号隔开的是and的条件,相当你的且。当不完全是,因为在后续处理中,逗号的处理逻辑在drools是有优化的。...从KieServices中获取KieContainer,用于给定KieModule的所有kiebase的容器。 设置FACT对象,其实就是你的决策对象的一些条件值。...索引方法 索引方法是指对 Rete 网络的节点建立当前节点对后继 的索引,在事实断言时可以通过索引快速找到对应的后继节 点而无需逐个查找。 2....带时间信息的事件处理 Rete 通过事实来表达当前状态,但是很多应用包括一些事件流中的时间,在事件并行执行中起到关键作用。所以需要 Rete 算法对这些信息进行处理。 3.

    75110

    规则引擎从入门到实践

    专家系统与规则引擎 近来,低代码平台的概念被炒得火热,事实上这并不是一个新生概念,早在上世纪 60 年代,就已经诞生了通过编写简单的伪代码、表达式实现复杂的逻辑推理程序,这就是“专家系统”。...从设计理念上来看,专家系统与如今的低代码系统的初衷是一致的,那就是用程序加上学习成本很低的逻辑代码实现对专家的替代。...通过将决策逻辑编写为更接近现实中语言的规则,存储在数据库或程序内存中,需要执行时取出规则并解析,从而实现小明让产品编写决策逻辑,动态修改的诉求。...Rete 算法最初是由卡内基梅隆大学的 Charles L.Forgy 博士在 1974 年发表的论文中所阐述的,他的核心并不复杂。...你可以仔细思考一下,无论是多么复杂的推理逻辑,都可以用不同的图将推理过程绘制出来,只是分支多少可能有所区别,事实上,这就是所谓的“决策网络”。

    1.4K10

    利用规则引擎搭建任务编排引擎

    引言 上一篇文章中,我们介绍了规则引擎的基本算法与使用: 规则引擎从入门到实践 我们看到,规则引擎的基础算法 Rete 算法其实是基于有向无环图的一种算法。...事实上,在实际工作生活中,并不是只有我们的逻辑推理是由有向无环图构成的,复杂的任务编排执行也可以被改造为有向无环图的形式。 2....但这个例子仍然是非常基础的,在实际的场景中,你可能还是会遇到以下这些问题: 4.1 任务重做 在实际场景中,任务的某个节点需要重做是经常让人很头疼的一件事,因为对于线上场景,任务经常是可重入的,否则重复回调等常见情况就会造成你的任务出现问题...4.2 性能 从性能上来说,规则文件的解析与实例化是非常耗时的,因此,提前 build,例如在项目启动时就完成所有规则的实例化,然后将 kieSession 放在内存中,这样在实际执行的过程中,性能会有明显提升...4.3 并发执行 显然,生产环境中要比上述 demo 更加复杂,最基本的一点,线上环境中,各个任务不会都在同一台机器上执行,同时,接收到异步回调的节点也会分布在不同的服务器上,虽然通过流程编排,解决了业务代码中的竞争条件

    2.3K10

    【Drools三】打工人学习Drools高级语法

    ,它可以让应用程序的对象在规则文件中能够被访问。...语法结构为:global 对象类型 对象名称 在使用global定义的全局变量时有两点需要注意: 1、如果对象类型为包装类型时,在一个规则中改变了global的值,那么只针对当前规则有效,对其他规则中的...(); kieSession.dispose(); 3.function函数 function关键字用于在规则文件中定义函数,就相当于java类中的方法一样。...可以在规则体中调用定义的函数。使用函数的好处是可以将业务逻辑集中放置在一个地方,根据需要可以对函数进行修改。...("小明"); kieSession.insert(student); kieSession.fireAllRules(); kieSession.dispose(); 4.LHS加强 前面我们已经知道了在规则体中的

    2.6K10

    SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    一、Drools引擎简介 1、基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效...具有易于访问企业策略、易于调整以及易于管理的特点,作为开源业务规则引擎,符合业内标准,速度快、效率高。...2、规则语法 (1)、演示drl文件格式 package droolRule ; import org.slf4j.Logger import org.slf4j.LoggerFactory ; dialect...、xml文件,也可以Java代码块硬编码; · package 规则文件中,package是必须定义的,必须放在规则文件第一行; · import 规则文件使用到的外部变量,可以是一个类,也可以是类中的可访问的静态方法...) ; kieSession.fireAllRules() ; } } 这样,完整的案例就结束了。

    1.4K20

    Drools规则引擎入门指南(二)

    本篇博客主要讲解Drools常用的属性以及函数 属性 首先我们在resources\rules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTests...1. salience优先级 salience 属性的值默认为0,它的值越大执行的优先级就越高,看如下代码在执行的时候就会先执行salience2 rule "salience2...testEnabled() { kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("enabled")); } 函数...接着我们在resources\rules文件夹下创建一个Function.drl,还有一个DroolsApplicationFunctionTests Drools中常用函数分别为insert、update...test1规则没有判断条件,所以直接被执行,执行过程中它生成了一个对象插入到工作内存中,此对象的规则又恰好与test2规则匹配,所以紧接着test2执行,test2执行时更新了user对象,更新后的对象又匹配了

    90600

    《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

    insert(newSomething()):创建一个新对象放置到working memory中。...insertLogical(newSomething()):功能类似于insert,但当创建的对象不再被引用时,将会被销毁。 delete(handle):从working memory中删除对象。...其实这些宏函数是KnowledgeHelper接口中方法对应的快捷操作,通过它们可以在规则文件中访问Working Memory中的数据。...insert函数 insert的作用与在Java 类当中调用KieSession的insert方法效果一样,都是将Fact对象插入到当前的Working Memory当中,基本用法格式如下: insert...查看KnowledgeHelper接口中的update方法可以发现,update函数有多种参数组合的使用方法。在实际使用中更多的会传入FACT对象来进行更新操作。

    1.4K80
    领券