Drools规则引擎之元数据
Declaring Metadata
元数据可使用到以下Drools结构中:事实(Fact)类型、属性和规则。Drools使用符号(@)引入元数据,使用格式如下:
@metadata_key(metadata_value)
metadata_value为可选项。
比如,如果要声明一个元数据属性author,值为bot,声明格式如下:
@author(Bob)
Drools允许任意元数据属性的声明,有些有特殊意义,有些只是用于运行时查询。Drools允许声明元数据的类型和属性。任何元数据之前声明的属性类型分配给事实类型,而元数据后表示一个属性被分配了特定的属性。
import java.util.Date declare Person @author( Bob ) @dateOfCreation( 01-Feb-2009 ) name : String @key @maxLength( 30 ) dateOfBirth : Date address : Address end
上例中,有两个元数据项声明的类型,@author和@dateOfCreation,和两个名为@key和@maxLength。@key元数据没有值,所以”括号” 也可以省略掉。
Predefined class level annotations预定义的类级别注释
有些注释预定义的语义解释的引擎。下面列出这些预定义的注释和它们的含义。
@role()
@role注释定义引擎应如何处理该类型的实例:要么是定期的事实或事件。
它接受两个可能的值:
fact : 是默认的,是处理类型作为一个普通的fact。
event : 是处理一个event 类型 event :事件
@typesafe()
默认情况下所有类型声明编译启用了类型安全;@typesafe(false)提供了一种方法来覆盖这个行为通过允许一个备用,类型安全评估所有约束生成MVEL约束和动态执行。这一点非常重要,当处理集合,没有泛型或混合型集合。
@timestamp()
每个事件都有一个关联的时间戳分配给它。默认情况下,对于一个给定的事件的时间戳从会话读时钟和分配给当时的事件事件插入到工作记忆。虽然,有时候,事件的时间戳作为自己的属性。在这种情况下,用户可能告诉引擎使用时间戳从事件的属性而不是从会话读时钟。
@duration()
Drools既支持事件语义:时间点事件和基于间隔事件。一个时间点事件都被表示为一个基于间隔事件的持续时间为零。默认情况下,所有事件持续时间为零。用户可能属性不同的时间事件通过声明属性的事件类型包含事件的持续时间。
@expires()
事件可能会自动过期一段时间后,在工作记忆。通常出现这种情况时,基于现有的规则知识库,事件可以不再匹配和激活任何规则。虽然,可以显式地定义事件时应该到期。
@expires() [#d][#h][#m][#s][#[ms]]
例如:@expires( 1h35m )
@propertyChangeSupport
Facts实现支持属性更改Javabean(tm)中定义的规范,现在可以进行注释,这样发动机本身注册监听变化事实属性。 boolean,用于insert()方法在Drools 4 API是弃用,不存在drools-api模块。
Predefined attribute level annotations预定义的属性级注释
@position模式支持位置参数类型声明。
简单的说明,就是该元数据起到的作用时标识,例如:
declare Person count : int @position(1) name:String @position(0) end
在规则中的引用,正确的写法是,Person p=newPerson(“张三”,10);
如果这两个两个值的顺序变了,也是会报错的。所以,我们现在应该明白这个元数据的作用了吧,就是指定参数位置的声明
@key 用法比较简单
属性将被用作一个关键标识符的类型,所以,生成的类将实现equals()和hashCode()方法时考虑属性比较这种类型的实例。
Drools将生成一个构造函数使用所有关键属性作为参数。
我们通过例子来说明一下:
declare Person2 count : int @key name:String end
count:
对于前面的示例,Drools将生成equals()和hashCode()方法,还会生成一个构造函数,我们就可以写成:
rule "3declare使用3" when eval(true) then Person2 p=new Person2(40 ); insert(p); end
Declaring Metadata for Existing Types现有类型的元数据
Drools允许现有类型的元数据属性的声明一样,当宣布为新的事实类型元数据属性。唯一的区别就是没有字段声明。
那我们举个例子说明一下:
import com.jars1.jars1.Person; declare Person @author(Bob) @dateOfCreation(01-Feb-2009) end declare com.jars1.jars1.Person @author(Bob) @dateOfCreation(01-Feb-2009) end
Drools技术视频
CSDN学院:《Drools7 规则引擎视频教程》
CSDN学院:《Drools7系列优惠套餐》
CSDN学院:《Drools7规则引擎进阶教程》
CSDN学院:《Drools7规则引擎入门教程》
CSDN学院:《Drools规则引擎之决策表从入门到精通》
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接