文章目录
- drl文件构成-rule部分
- 结果部分 RHS
- set
- insert && insertLogical
- modify && update
- delete
drl文件构成-rule部分
drl文件构成,位于官网的第5章位置,也是drools作为规则引擎应用的最核心部分。
其中rule模块,包括属性(Attribute - rule)、条件(Condition - when)、结果(Action - then)是5.1.7、5.1.8、5.1.9 三小节部分内容。
- Rule Language Reference
官网链接:https://docs.drools.org/7.73.0.Final/drools-docs/html_single/index.html#_droolslanguagereferencechapter
结果部分 RHS
then和en的中间的部分称作 结果部分,Action。
顾名思义,结果部分,即是当触发该规则之后要进行的操作。
导图中几个操作都是常用操作。
set
给fact对象属性赋值。不会将修改通知给drools引擎,因此,不会造成重新触发规则。
rule "rule1"
when
$order:Order(amount < 100)
then
// 结果中给order对象的score赋值了0,并打印了日志:触发规则:小于100无积分。
$order.setScore(0);
System.out.println("触发规则:小于100无积分。");
end
insert && insertLogical
Stated insertions: insert();使用该方法插入的Fact,该fact通常需要显示删除。该对象成为stated对象。
官网描述:使用此选项可以将新事实插入Drools引擎的工作内存中,并根据需要定义结果字段和值。
Logical insertions:inertLogical();进行逻辑插入后,如果插入fact的规则中的条件不再成立,则插入的fact将自动删除。当没有条件支持逻辑插入时,这些逻辑插入的fact将被删除。 Drools引擎认为逻辑上插入的fact是会被Drools引擎理解为justified对象。
官网描述:使用此选项在Drools引擎中逻辑地插入一个新事实。Drools引擎负责插入和收回事实的逻辑决策。在常规或陈述的插入之后,必须明确撤回事实。在逻辑插入之后,当插入事实的规则中的条件不再为真时,插入的事实将自动收回。
引用原文链接:https://blog.csdn.net/ystyaoshengting/article/details/107643266
这篇博客中的解释更利用理解,所以直接引用了。
modify && update
首先,只要修改了LHS中判断的属性中任何一个属性的值,就会重新触发该规则。
modify:使用此选项可以指定要为某个事实修改的字段,并将更改通知Drools引擎。该方法提供了一种结构化的事实更新方法。它将更新操作与setter调用相结合,以更改对象字段。
update:使用此选项可以指定要更新的字段和整个相关事实,并将更改通知Drools引擎。事实更改后,必须在更改可能受更新值影响的另一个事实之前调用update。要避免此添加步骤,请改用modify方法。
这俩是翻译官网的解释。
总之,使用的时候,二者基本上可以通用,只是语法有所不同。
rule "loop_test_1"
no-loop true
when
$order:Order(amount < 100 || score > 5)
then
modify($order){setScore(10)};
// $order.setScore(10);
// update($order);
System.out.println("触发规则:小于100,10积分。loop_test_1");
end
其中
modify($order){setScore(10)};
等同于
o
r
d
e
r
.
s
e
t
S
c
o
r
e
(
10
)
;
u
p
d
a
t
e
(
order.setScore(10); update(
order.setScore(10);update(order);
delete
与insert对应,是在session内存中删除fact。