首页 > 其他分享 >drools_07_macro_functions

drools_07_macro_functions

时间:2022-10-30 11:07:24浏览次数:54  
标签:drools functions 07 触发 modify update rule order 属性

delete()和retract() 宏函数

delete() 用于在rule RHS中将对象从工作内存中删除, retract()函数有同样的作用, 不过已经被标记为废弃状态.

insert() 宏函数

insert() 用于在rule RHS中增加新的fact对象, 新的fact对象会自动完成模式匹配, 所以需要避免循环触发问题.

update()和 modify() 宏函数

update和modify 用于在rule RHS中修改fact对象,并期望对该fact对象重新模式匹配, 如果不期望重新模式匹配, 不需要调用这两个宏函数, 调用这两个函数需要额外注意不要引起循环rule触发.

循环触发问题

当然, drools 也有机制尽量避免无谓的重复模式匹配, 具体说明:

  • 在update()/modify()所在的rule, 如果更新的属性同时用在了LHS条件中, 那么drools认为需要触发该规则, 这时很容易发生循环触发问题, 需要格外注意, 可以为rule增加 no-loop 属性来避免.
  • 在update()/modify()所在的rule, 如果修改的属性没用在了LHS条件中, drools会智能地判断出没有必要触发该规则, 对于该规则来讲是没有循环重复问题. 但如果先触发了另一个规则, 在那个规则中又对原规则的LHS条件属性做了修改, 这样还会出现循环触发问题, 这时即使加了no-loop 属性也不管用.
// 修改了amount属性, 但是LHS用的是originalPrice属性, 所以对于本规则不会循环触发
rule "not_worry_loop"
when
$order:Order(originalPrice>0)
then
$order.setAmount(100);
update($order) ;
System.out.println("rule fired") ;
end
// 修改了amount属性, LHS也使用了amount属性, 所以会循环触发
rule "always_loop"
when
$order:Order(amount>0)
then
$order.setAmount(100);
update($order) ;
System.out.println("rule fired") ;
end

update() 和 modify()区别

  • 推荐使用 modify() 而不是 update()
    官方的解释是: After a fact has changed, you must call ​​​update​​​ before changing another fact that might be affected by the updated values. To avoid this added step, use the ​​modify​​ method instead.
  • 语法比较
    update()语法简单, modify()语法比较奇怪, 要将修改的属性包在{ } 中, 见下面的示例.
rule "not_worry_loop2"
when
$order:Order(originalPrice>0)
then
modify($order) {
setAmount(100);
}
System.out.println("rule fired") ;
end



标签:drools,functions,07,触发,modify,update,rule,order,属性
From: https://blog.51cto.com/u_15585381/5807412

相关文章

  • HCIA-ICT实战基础07-访问控制列表ACL进阶
    HCIA-ICT实战基础-访问控制列表ACL进阶目录二层ACL技术及配置高级ACL的扩展使用方法及使用场景1二层ACL技术及配置1.1二层ACL概念使用报文的以太网帧头来定义规则,......
  • 搞清楚基本单元:记得保存before; 快慢指针; 把长的截断使得两者一样长; 搞明白循环 |
    24.两两交换链表中的节点搞清楚基本单元:两个Node,记得保存beforehttps://leetcode.cn/problems/swap-nodes-in-pairs解题思路搞清楚基本单元:两个Node记得保存be......
  • javascript:监控video全屏时取消静音(chrome 107.0.5304.87)
    一,js代码:<html><head><metacharset="utf-8"/><title>测试</title></head><body><divstyle="width:50%;height:100%;float:left;margin-left:-0.3px;pos......
  • 0075-Go-变量
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/variables目标使用Go语言变量的申明和使用变量。示例packagemainimport"fmt"funcma......
  • 0076-Go-常量
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/constants目标使用Go语言的常量。示例packagemainimport("fmt""math")co......
  • 0077-Go-for 循环
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/for目标使用Go语言的for循环。单条件循环类似其它语言中的while循环。packagemain......
  • 0078-Go-if else 条件判断
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/if-else目标使用Go语言的if/else条件判断。条件判断条件判断的小括号可以省略,但是后面的......
  • 0079-Go-switch 分支
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/switch目标使用Go语言的switch分支语句。整数分支packagemainimport"fmt"funcmai......
  • 0073-Go-hello world
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/hello-world目标使用Go语言打印helloworld。初始化项目gomodinitjiangbo/go打印hel......
  • 0074-Go-值类型
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/values目标使用Go语言的字符串,整型,浮点型和布尔类型。示例packagemainimport"fmt"fu......