2.0 概述
本章节主要讲解Drools规则语法的基本概念、语法结构以及如何使用该语法开发规则。在本章节中,读者将学习到:
-
Drools 规则语法的基本概念
-
Drools 规则语法的语法结构
-
如何使用 Drools 规则语法开发规则
-
Drools 规则语法的一些常见用法
本章节将详细地演示如何使用Drools规则语法进行规则开发,并通过大量实例进行详细解释,使读者能够熟练掌握 Drools 规则语法。
2.1 定义规则
定义规则是 Drools 的核心部分,每一条规则都是一个模板,用于识别符合特定模式的事实。一个规则的语法如下:
rule "规则名称"
when
条件语句
then
执行语句
end
定义规则的时候,可以设置规则的名称、条件语句和执行语句。规则的名称是可读的字符串,用于描述规则的用途。
下面是一个实例,用于说明如何定义规则:
rule "预警规则"
when
$person : Person(age > 18)
then
System.out.println("预警:" + $person.getName() + "的年龄大于18岁");
end
在上面的规则中,我们定义了一个名为预警规则的规则,规则的条件语句是年龄大于 18 岁,并且当条件语句成立时,执行语句会输出预警信息。
2.2 模式匹配语法
模式匹配语法是 Drools 的一种用于识别事实的语法,其语法格式如下:
$变量名 : 类型 (属性 = 值)
模式匹配语法中的变量名是任意的,用于在规则中引用该对象,类型是 Java 对象的类型,属性是对象的属性,值是该属性的值。
在Drools规则引擎中,模式匹配语法是一种查找对象的方法,可以将它们与规则匹配。模式匹配语法的语法如下:
$变量名 : 类型(条件语句)
举个例子,我们需要找到所有价格高于100的商品:
rule "high priced items"
when
$item : Item( price > 100 )
then
System.out.println("价格高于100的商品为:" + $item.getName());
end
2.3 数据类型
Drools支持的数据类型,包括Java内置数据类型以及用户定义的数据类型。
Drools支持以下数据类型:
-
原始数据类型:包括布尔型,整型,浮点型,字符型,字符串型等。
-
对象类型:包括Java对象,集合类型等。
如果需要在规则中使用Java对象类型,需要先定义该类型的Fact对象。例如:
declare Person
name : String
age : int
end
对于集合类型,Drools支持的集合类型包括:
-
List
-
Set
-
Map
例如,定义一个List类型的Fact对象:
declare Orders
orderList : List
end
Drools还支持一些特殊的数据类型,如Date、Time、Duration等,可以根据需要使用。下面是一个简单的例子,演示了如何在规则中使用数据类型:
declare Person
name : String
age : int
end
rule "check age"
when
$p : Person(age > 18)
then
System.out.println($p.getName() + " is an adult.");
end
在上面的例子中,我们定义了一个Person类型的Fact对象,并且在规则中使用了age字段。如果一个Person的年龄大于18岁,就会触发规则。
2.4 变量引用
在Drools规则引擎中,变量引用是一个很重要的概念。它可以让我们在规则中引用任意一个Java对象,从而判断该对象是否符合特定条件。
我们可以在规则定义中声明一个变量,并在规则条件语句中使用该变量引用对象的属性进行判断。
例如:
// 声明一个变量person
declare Person
name : String
age : int
end
// 定义一个规则,当person的年龄大于18时,触发规则
rule "adult person"
when
$p : Person(age > 18)
then
System.out.println($p.name + " is an adult.");
end
在这个例子中,我们声明了一个名为Person的变量,并定义了该变量的两个属性:name和age。在规则定义中,我们使用了一个$p变量引用Person对象,并在规则条件语句中使用了$p.age引用Person对象的age属性,判断该Person对象是否是成年人。
结合实际应用,变量引用是Drools强大的特性之一,通过引入变量,我们可以更灵活地编写规则,并能够根据不同的需求实现丰富的业务场景。
2.5 条件语法
在Drools规则中,条件语法是非常重要的一部分,它决定了规则是否应该被执行。在Drools中,可以使用条件语法来判断对象的状态是否满足特定的要求。
Drools支持多种运算符,用于定义条件语句和规则执行语句,常见的运算符包括:
-
算术运算符:+、-、*、/ 等,用于数学运算。
-
比较运算符:>、<、>=、<=、==、!= 等,用于比较两个值的大小关系。
-
逻辑运算符:&&、||、! 等,用于逻辑判断。
-
条件运算符:? : 等,用于按条件执行语句。
-
成员运算符:in、not in 等,用于判断一个值是否是某个集合或列表的成员。
-
特殊运算符:
-
in:判断一个值是否在指定的集合中。
-
not in:判断一个值是否不在指定的集合中。
-
exists:判断是否存在匹配的事实对象。
-
eval:执行Java代码并返回结果。
-
pattern:用于在规则中引用模式。
如下为一些使用运算符写的条件表达式示例
Drools条件语法使用Java中的布尔运算符和语法,例如:
Person(age < 30)
条件语法还支持使用Java中的算术运算符,例如:
Person(age + 5 < 35)
条件语法还支持使用Java中的逻辑运算符,例如:
Person(age < 30 && name.startsWith("J"))
条件语法还支持使用Drools中的函数,例如:
Person(isAdult(age))
下面是一个使用条件语法的代码示例:
rule "check customer age"
when
Customer( age >= 18 )
then
System.out.println("The customer is over 18.");
end
在这个示例中,我们定义了一个规则“check customer age”,在when部分,我们使用了条件语法来判断客户的年龄是否大于等于18岁,如果满足条件,那么在then部分,将会输出“The customer is over 18.”。
除了简单的逻辑表达式,Drools还支持更复杂的条件语句,如下面的示例所示:
rule "complex condition example"
when
$p : Person( age >= 18 && name == "John" )
then
System.out.println("Person is eligible to vote and his name is John");
end
该规则说明,当一个人的年龄大于等于18岁并且名字为John时,才能执行该规则。
总的来说,Drools的条件语法是非常强大的,可以满足大多数业务需求,并且非常易于使用和理解。本章节简单介绍了常用的运算符及运算规则,后续文章会详细介绍有关属性的使用方法。
2.6 规则执行语法
在Drools中,规则的执行语法是指在规则满足条件时所要执行的操作。这些操作可以是对于规则中的变量的修改,也可以是执行一些方法,或者是结合其他语法在规则中实现一些业务逻辑。
规则执行语法包括以下内容:
-
赋值语法:使用赋值语法可以给规则中的变量赋值。
-
方法调用语法:使用方法调用语法可以在规则中执行指定的方法。
-
insert语法:使用insert语法可以向Working Memory中插入新的对象。
-
retract语法:使用retract语法可以从Working Memory中移除对象。
-
modify语法:使用modify语法可以对Working Memory中的对象进行修改。
下面是一个代码示例,该示例演示了规则执行语法的使用。
rule "apply discount"
when
$customer : Customer(purchased >= 1000)
then
modify($customer) { setDiscount(0.1) };
end
在上述代码中,我们定义了一个规则,该规则检查Customer对象的purchased属性是否大于等于1000。如果该条件为真,则使用modify语法对该对象的discount属性进行修改,将其设置为0.1。
Drools规则有如下常用属性:
属性名称 |
类型 |
默认值 |
描述 |
no-loop |
Boolean |
false |
在一个规则当中如果条件满足就对`Working Memory`当中的某个Fact对象进行了修改,比如使用update 将其更新到当前的`Working Memory`当中,这时引擎会再次检查所有的规则是否满足条件,如果满足会再次执行. |
salience |
Integer |
0 |
设置规则执行的优先级, |
agenda-group |
定义激活的规则组,一个规则组中的规则只会被激活一次。 |
||
activation-group |
String |
N/A |
定义规则的优先级。当一个规则匹配事实时,Drools将把规则加入到该组的议程中,并选择优先级最高的规则执行。 |
lock-on-active |
Boolean |
false |
当在规则上使用 |
ruleflow-group |
String |
N/A |
|
dialect |
String |
"java" or "mvel" |
|
date-effective |
N/A |
|
仅当当前日期和时间在日期有效属性后面时,才能激活规则。 |
date-expires |
N/A |
|
如果当前日期和时间在 |
enabled |
Boolean |
True |
表示规则是可用的,如果手工为一个规则添加一个 |
duration |
Long |
N/A |
持续时间指示规则将在指定的持续时间之后触发,如果它仍然是true. |
发表评论