Declaring Metadata
元数据可能会分配到几个不同的结构在Drools:事实类型、属性和规则。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( <fact | event> )
@role注释定义引擎应如何处理该类型的实例:要么是定期的事实或事件。
它接受两个可能的值:
fact : 是默认的,是处理类型作为一个普通的fact。
event : 是处理一个event 类型 event :事件
@typesafe( <boolean> )
默认情况下所有类型声明编译启用了类型安全;@typesafe(false)提供了一种方法来覆盖这个行为通过允许一个备用,类型安全评估所有约束生成MVEL约束和动态执行。
这一点非常重要,当处理集合,没有泛型或混合型集合。
@timestamp( <attribute name> )
每个事件都有一个关联的时间戳分配给它。默认情况下,对于一个给定的事件的时间戳从会话读时钟和分配给当时的事件事件插入到工作记忆。虽然,有时候,事件的时间戳作为自己的属性。在这种情况下,用户可能告诉引擎使用时间戳从事件的属性而不是从会话读时钟。
@duration( <attribute name> )
Drools既支持事件语义:时间点事件和基于间隔事件。一个时间点事件都被表示为一个基于间隔事件的持续时间为零。默认情况下,所有事件持续时间为零。用户可能属性不同的时间事件通过声明属性的事件类型包含事件的持续时间。
@expires( <time interval> )
事件可能会自动过期一段时间后,在工作记忆。通常出现这种情况时,基于现有的规则知识库,事件可以不再匹配和激活任何规则。虽然,可以显式地定义事件时应该到期。
@expires
( <timeOffset> ) [#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
在规则中的引用,正确的写法是,
P
erson
p
=new
Person
(
"
张三
"
,
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从入门到精通:可下载开源全套Drools教程
深度Drools教程不段更新中:
更多Drools实战陆续发布中………
扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓