返回顶部
首页 > 资讯 > 精选 >drools中then部分怎么写
  • 383
分享到

drools中then部分怎么写

2023-06-30 16:06:19 383人浏览 独家记忆
摘要

这篇文章主要介绍“drools中then部分怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“drools中then部分怎么写”文章能帮助大家解决问题。1、背景此处介绍一下drools中then部

这篇文章主要介绍“drools中then部分怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“drools中then部分怎么写”文章能帮助大家解决问题。

1、背景

此处介绍一下droolsthen部分的写法,以及一些内置的方法,比如insert/delete/modify等等。同时也介绍一下rule的继承,和在when中实现if else if 等操作。

2、支持的方法

drools提供了一些内置的方法,这些方法会修改drools的工作内存Fact对象的值。从而会导致重新进行模式匹配。

2.1 insert 插入对象到工作内存中

insert是向工作内存中插入对象,同时会导致重新进行规则的模式匹配。同时当规则不满足时,不会自动删除。

2.1.1 需求

当发生火灾Fire时,向工作内存中插入一个Alarm对象,告警发生后,删除工作内存中的Fire对象,然后检测Alarm对象是否还存在。

2.1.2 drl文件编写
package rulesimport com.huan.drools.insertmethod.Fireimport com.huan.drools.insertmethod.Alarmrule "insert_发生火灾时,往工作内存中插入告警对象"    when        $fire: Fire()    then        System.out.println("1、发生火灾时,往工作内存中插入告警对象");        insert(new Alarm($fire));endrule "insert_当规则内存中存在告警对象,进行告警,然后删除火灾对象"    when        $fire: Fire()        $alarm: Alarm( fire == $fire )    then        System.out.println("2、进行告警,然后删除对应的火灾对象");endrule "insert_检测告警对象是否还是存在-01"    when        Alarm()    then        System.out.println("3、insert 插入的告警对象还存在");        // 删除工作内存中的Fire对象        delete($fire);endrule "insert_检测告警对象不存在"    when        not Alarm()    then        System.out.println("3、insert 插入的告警对象不存在");end

此处使用的是 insert进行插入

2.1.3 部分java代码编写
// 将火灾对象插入到工作内存中kieSession.insert(new Fire());// 只触发规则名称以 insert_ 开头的规则kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("insert_"));
2.1.4 运行结果

发生火灾时,往工作内存中插入告警对象
2、进行告警,然后删除对应的火灾对象
3、insert 插入的告警对象还存在

2.1.5 结论
  • insert可以向工作内存中插入Fact对象。

  • insert方法调用后,会导致模式的重新匹配,导致之前不会执行的规则,重新执行。

  • insert方法插入到工作内存的对象,在规则不成立时,不会自动删除,需要手动删除,注意和insertLogical的区别

2.2 insertLogical 插入对象到工作内存中

insert是向工作内存中插入对象,同时会导致重新进行规则的模式匹配。同时当规则不满足时,会自动删除。

2.2.1 需求

当发生火灾Fire时,向工作内存中插入一个Alarm对象,告警发生后,删除工作内存中的Fire对象,然后检测Alarm对象是否还存在。

2.2.2 drl文件编写
package rulesimport com.huan.drools.Fireimport com.huan.drools.Alarmrule "insertLogical_发生火灾时,往工作内存中插入告警对象"    when        $fire: Fire()    then        System.out.println("1、发生火灾时,往工作内存中插入告警对象");        insertLogical(new Alarm($fire));endrule "insertLogical_当规则内存中存在告警对象,进行告警,然后删除火灾对象"    when        $fire: Fire()        $alarm: Alarm( fire == $fire )    then        System.out.println("2、进行告警,然后删除对应的火灾对象");        delete($fire);endrule "insertLogical_检测告警对象是否还是存在-01"    when        Alarm()    then        System.out.println("3、insertLogical 插入的告警对象还存在");endrule "insertLogical_检测告警对象不存在"    when        not Alarm()    then        System.out.println("3、insertLogical 插入的告警对象不存在");end

此处使用的是insertLogical插入

2.2.3 部分java代码编写
kieSession.insert(new Fire());kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("insertLogical_"));
2.2.4 运行结果

发生火灾时,往工作内存中插入告警对象
2、进行告警,然后删除对应的火灾对象
3、insertLogical 插入的告警对象不存在

2.2.5 结论
  1. insertLogical可以向工作内存中插入Fact对象。

  2. insertLogical方法调用后,会导致模式的重新匹配,导致之前不会执行的规则,重新执行。

  3. insertLogical方法插入到工作内存的对象,在规则不成立时,会自动删除注意和insert的区别

2.3、update 更新工作内存中的对象

update: 使用它来指定要更新的字段和整个相关Fact,并将更改通知 Drools 引擎。 Fact发生更改后,您必须在更改可能受更新值影响的另一个事实之前调用 update。 为避免此添加步骤,请改用 modify 方法。

2.3.1 需求

规则一: 当工作内存中存在火灾对象Fire,并且名字name为空时触发规则,同时在设置火灾的名字为大火灾
规则二: 当火灾存在名字时,输出火灾名字

2.3.2 drl 文件编写
package rulesimport com.huan.drools.Fireimport com.huan.drools.Alarmrule "update_当存在火灾对象时,设置一个火灾的名字"    when        $fire: Fire(name == null)    then        System.out.println("1、设置火灾名字");        $fire.setName("大火灾");        update($fire)endrule "update_当火灾对象存在名字时触发"    when        $fire: Fire(name != null)    then        System.out.println("2、火灾对象的名字为: " + $fire.getName());end
2.3.3 部分java文件编写
kieSession.insert(new Fire());kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("update_"));
2.3.4 运行结果

设置火灾名字
2、火灾对象的名字为: 大火灾

2.3.4 结论
  • update会导致模式的重新匹配。

  • update会修改工作对象内存中的值。

2.4、modify 更新工作内存中的对象

modify: 使用它来指定要为Fact对象修改的字段并将更改通知 Drools 引擎。 此方法提供了一种结构化的事实更新方法。 它将更新操作与 setter 调用相结合以更改对象字段。

2.4.1 需求

规则一: 当工作内存中存在火灾对象Fire,并且名字name为空时触发规则,同时在设置火灾的名字为大火灾
规则二: 当火灾存在名字时,输出火灾名字

2.4.2 drl 文件编写
package rulesimport com.huan.drools.Fireimport com.huan.drools.Alarmrule "modify_当存在火灾对象时,设置一个火灾的名字"    when        $fire: Fire(name == null)    then        System.out.println("1、设置火灾名字");        modify($fire){            setName("大火灾")        }endrule "modify_当火灾对象存在名字时触发"    when        $fire: Fire(name != null)    then        System.out.println("2、火灾对象的名字为: " + $fire.getName());end
2.4.3 部分java文件编写
kieSession.insert(new Fire());kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("modify_"));
2.4.4 运行结果
  • 设置火灾名字

  • 火灾对象的名字为: 大火灾

2.4.5 结论
  • modify会导致模式的重新匹配。

  • modify会修改工作对象内存中的值。一般情况下使用modify,不要使用update

2.5 delete 删除工作内存中的对象

用法:delete(<object>)

retract也是和delete一样的效果,但是推荐使用delete

3、drools变量的简单使用

package rulesrule "drools_变量的使用"    wh        eval(true)    then        System.out.println("Match激活的当前触发规则: " + drools.getMatch());        System.out.println("当前触发规则的名字: " + drools.getRule().getName());        // System.out.println("终止规则执行fireUntilHalt(): " + drools.getKieRuntime().halt());        // System.out.println("激活AgendaGroup组: " + drools.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus());        System.out.println("获取所有全局变量: " + drools.getKieRuntime().getGlobals());        // System.out.println("设置全局变量:" +  drools.getKieRuntime().setGlobal("username","huan"); );        // System.out.println("获取查询结果:" + drools.getKieRuntime().getQueryResults());end

4、规则的继承

4.1 需求

规则一: 如果用户(customer)的年龄(age)大于60岁,则打0.9折。
规则二: 在规则一的基础上,如果用户有车(car),则可以免费停车(freeParking)。

4.2 drl文件编写

package rulesimport com.huan.drools.Customerimport com.huan.drools.Carrule "rule_extends_规则一"    when        $c: Customer(age > 60)    then        modify($c){            setDiscount(0.9)        }        System.out.println("触发规则一:用户年龄>60岁,打0.9折");end// 规则二继承规则一的条件rule "rule_extends_规则二" extends "rule_extends_规则一"    when        $car: Car()    then        modify($car){            setFreeParking(true)        }        System.out.println("触发规则二:用户有车,免费停车");end

此处rule_extends_规则二继承了rule_extends_规则一,所以规则一的条件也继承了。

4.3 部分java代码

Car car = new Car();Customer customer = new Customer();customer.setAge(65);kieSession.insert(customer);kieSession.insert(car);kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("rule_extends_"));

客户有车,并且年龄是65岁,满足上方的规则一和规则二

4.4 运行结果

触发规则一:用户年龄>60岁,打0.9折
触发规则二:用户有车,免费停车

4.5 结论

可以看到在rule上使用extends关键字,可以实现规则的继承。

5、使用do[...]语法重写上方继承的例子

5.1 需求

只要用户大于60岁,直接打0.9折,如果还有车,则可以免费停车。

5.2 drl文件编写

package rulesimport com.huan.drools.Customerimport com.huan.drools.Carrule "命名结果_rule"    when        $c: Customer(age > 60)        do[giveDiscount] // 当上方的条件成立时执行 then [giveDiscount]        $car: Car() // 此条件成立时,执行默认的 then    then        modify($car){            setFreeParking(true)        };        System.out.println("用户有车,免费停车");    then [giveDiscount]        modify($c){            setDiscount(0.9)        };        System.out.println("用户年龄>60岁,打0.9折");end

解释: 见上方的规则文件里的注视

5.3 部分java代码编写

Car car = new Car();Customer customer = new Customer();customer.setAge(65);kieSession.insert(customer);kieSession.insert(car);kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("命名结果_"));

5.4 运行结果

用户年龄>60岁,打0.9折
用户有车,免费停车

也实现了需求

5.5 结论

通过when中使用 do[名字] 然后 then then 名字 也可以实现。

6、实现 if else if 的效果

6.1 需求

完成类似 if else if else效果。见下方的各种执行结果

6.2 规则文件

rule "if else-if"    when       $customer: Customer(age > 60) // 规则内存中存在Customer对象,并且age>60        if($customer.getLevel() == 1) do[level1] // 用户的级别是1,执行then[level1],然后继续执行下方的条件        else if ($customer.getLevel() == 2) break[level2] // 用户的级别是2,执行then[level2],不在执行下方的条件        else do[levelOther] // 其他的level级别,执行then[levelOther],然后在执行下方的条件        Car()    then        System.out.println("我执行了");    then[level1]        System.out.println("level1");    then[level2]        System.out.println("level2");    then[levelOther]        System.out.println("levelOther");end

6.3 执行结果图

drools中then部分怎么写

6.4 各种执行结果-也就是上图的解释

Customerage小于60
输出: 没有输出。
2、Customerage大于60并且level=1,没有Car
输出: level1
3、Customerage大于60并且level=1,有Car
输出: level1 我执行了
4、Customerage大于60并且level=2,没有Car
输出: level2
5、Customerage大于60并且level=2,有Car
输出: level2
6、Customerage大于60并且level=3,没有Car
输出: levelOther
7、Customerage大于60并且level=3,有Car
输出: levelOther 我执行了

6.5 do和 break 有什么区别

do:执行完之后,还会继续判断后面的执行条件。 (即还会执行后面的Car判断,根据是否有Car获取不同的结果
break:执行完之后,不会在判断后面的执行条件。(即忽略了后面的Car判断,rule执行完了

关于“drools中then部分怎么写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: drools中then部分怎么写

本文链接: https://lsjlt.com/news/330194.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • drools中then部分怎么写
    这篇文章主要介绍“drools中then部分怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“drools中then部分怎么写”文章能帮助大家解决问题。1、背景此处介绍一下drools中then部...
    99+
    2023-06-30
  • drools中then部分的写法(推荐)
    目录1、背景2、支持的方法2.1 insert 插入对象到工作内存中2.1.1 需求2.1.2 drl文件编写2.1.3 部分java代码编写2.1.4 运行结果2.1.5 结论2....
    99+
    2024-04-02
  • es6中then方法怎么用
    这篇文章主要介绍“es6中then方法怎么用”,在日常操作中,相信很多人在es6中then方法怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”es6中then方法怎么用”...
    99+
    2024-04-02
  • mysql中case when then语句怎么用
    小编给大家分享一下mysql中case when then语句怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • oracle中的case when then怎么使用
    本篇内容主要讲解“oracle中的case when then怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“oracle中的case when t...
    99+
    2023-07-05
  • 部署云服务器的事例分析怎么写
    首先,需要分析一下客户端使用云服务器的原因。可以从以下几个方面来考虑: 客户端为什么需要使用云服务器 - 减少数据的访问和处理时间 - 避免单点故障 - 节省空间和存储空间 - 提高数据可靠性和安全性 - 降低成本和维护成本 在进行...
    99+
    2023-10-27
    事例 服务器
  • 部署云服务器的事例分析怎么写的
    硬件选择 选择合适的硬件是部署云服务器的第一步。首先,应该根据自己的需求和预算选择合适的硬件。例如,如果你的服务器需要处理大量数据,则应该选择更快的硬盘或者更大容量的硬盘。其次,应该选择高质量的硬件,如服务器主板、内存、硬盘等。 软...
    99+
    2023-10-27
    事例 服务器
  • mysql中分组函数怎么写
    mysql 中的分组函数用于将数据集按分组计算聚合值。常用的函数有:sum:计算指定列中值的总和count:计算指定列中非 null 值的数量avg:计算指定列中值的平均值min:计算指...
    99+
    2024-04-29
    mysql 聚合函数
  • CSS内部样式怎么写
    本篇内容介绍了“CSS内部样式怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! <h2 sty...
    99+
    2024-04-02
  • 部署云服务器的事例分析报告怎么写
    一、引言 部署云服务器是现代企业数字化转型的必要举措。随着互联网的飞速发展,企业的信息化建设也在不断加速,而云计算作为一种新兴的IT基础设施,正好满足了企业的需求。因此,部署云服务器已经成为企业数字化转型的必经之路。 在过去,传统的服务器...
    99+
    2023-10-27
    事例 分析报告 服务器
  • ListView中怎么实现部分刷新
    在ListView中实现部分刷新可以通过调用Adapter的notifyItemChanged()方法来实现。 首先,在你的Ad...
    99+
    2023-10-26
    ListView
  • MyCat中怎么实现读写分离
    这期内容当中小编将会给大家带来有关MyCat中怎么实现读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、mycat实现读写分离这里没有用到mysql03主机,读写...
    99+
    2024-04-02
  • mybatis中怎么实现读写分离
    本篇文章为大家展示了mybatis中怎么实现读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、spring aop实现首先application-test.yml增加如下数据源的配置spri...
    99+
    2023-06-20
  • mysql中分组函数怎么写的
    mysql 中的分组函数按指定列分组数据,并对每个组计算聚合值。分组函数包括 count、sum、avg、min 和 max。having 子句可过滤分组结果,保留满足条件的组...
    99+
    2024-05-01
    mysql
  • css外部样式表怎么写
    这篇文章主要介绍“css外部样式表怎么写”,在日常操作中,相信很多人在css外部样式表怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css外部样式表怎么写”的疑惑有所帮...
    99+
    2024-04-02
  • 外部js调用jquery怎么写
    在使用外部js文件调用jQuery库之前,需先确认页面中是否已经引用了jQuery库。如果未引用,则需要在html文件中先引用jQuery库。以下为一般外部js文件调用jQuery库的步骤:创建一个.js文件,存放在服务器或者本地主机中,例...
    99+
    2023-05-23
  • java分页怎么写
    实现原理很简单,就是建立一个Page类,里面放当前访问的页数(这个是从客户浏览器传到后台的数据,所以你的分页需要用它来定位记录的条目)和每一页显示的记录行数。然后通过分页计算就可以得出下列数据。(假定你的页数从1开始)推荐:java基础教程...
    99+
    2019-07-14
    java
  • mysql分页怎么写
    mysql分页查询通过偏移和限制子句将数据集划分为较小的子集:1.计算偏移量:偏移量=(页码-1)分页大小。2.限制结果:limit分页大小。3.组装查询:select fr...
    99+
    2024-08-01
    mysql
  • HBase中怎么部署分布式集群
    本篇文章为大家展示了HBase中怎么部署分布式集群,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.简介HBase是一个分布式的、面向列的开源数据库,它不同于一般的...
    99+
    2024-04-02
  • pycharm中怎么运行一部分代码
    在 pycharm 中运行部分代码有两种方法:运行选定代码块:选中代码并按 ctrl + /(windows/linux)或 cmd + /(macos),选择“运行选定文本”。使用调试...
    99+
    2024-04-25
    linux macos pycharm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作