33、Drools语法篇之包的应用

包是规则和其他相关结构,比如导入和全局(imports and globals),的一个集合。包的成员通常是相 互关联的
一个包代表一个命名空间,理想的是对一 个给定的规则组保持唯一。包名本身是命名空间,并且不以任何方式关联到文件或文件夹。
可以从多个规则源组合规则, 并且有一个顶级的包配置, 所有的规则在它的控制之下 (在组合规则时) 。
虽然,  声明在不同名字下的资源, 不可能合并为同一个包。 然而, 单个规则库可以用多个包来构建它。
一个普通的结构是在同一个文件中具有所有规则的一个包作为包声明(所以它完全是自包含的),通过实验证明,package 代表的不是具体的物理地址,只要在等同物理目录下的规则文件,都表示是同一组包的规则。

个包必须有一个命名空间,并且使用标准的 java 包名协议声明;即,没有空格,不象规则命名,它允许空格。在元素的顺序方面,在规则文件中,它们可以以任意的顺序显现,但 package 语句除外,它必须在文件的顶部。在所有情况下,分号都是可选的。


注意,任何规则属性(如规则属性章节描述的一样)也可以在包这一级编写,代替属性的默认值。修 改后的默认值仍然可以通过在规则中的属性设置来替换。

import( 导入)
导入语句的作用和在 java 中的导入语句一样。你需要为你想在规则中使用的对象指定完全合格路径 和类型名字。Drools 自动从同名的 java 包中导入类,也可从 java.lang 包导入

global( 全局)   其实就是一个常量,在规则内部改是不会发现变化的
用 global 你可以定义全局变量。使用它们让 应用程序对象可用于规则。通常,它们被用来为 规则提 供数据和服务,尤其是用在规则推论中的应用程序服务,以及从规则返回数据,例如,日志或添加到 规则推论中的数据,或者用于规则与应用程序的交互,做回调。全局变量没有被插入到工作内存,因 此,全局变量绝不能被用来在规则中建立条件,除非它是一个恒定不变的值。引擎不能知道全局变量 的改变, 不能跟踪它们的变化。在约束中不正确地使用全局变量可能产生难以预料的结果——令人惊
注:如果多个包使用相同的标识符声明了全局变量,那么它们必须有相同的类型,并且它们所有会都引用 相同的全局变量的值。
1. 在你的规则文件中声明你的全局变量,并在规则中使用它们。例如:
global java.util.List myGlobalList; 
rule "Using a global"
    when
        eval( true )
    then
        myGlobalList.add( "Hello World" );
end

在你的工作内存中设置全局变量的值。最佳作法是,在断言工作内存的任何事实之前设置全局 变量的值。例如:
List list = new ArrayList();
KieSession ksession  k2 . newKieSession ( "Rulebasequery-session" ) ;
ksession .setGlobal( "myGlobalList", list );   //myGlobalList这里的值是对应全局变量的name

注意,  它们只是命名对象的实例, 从你的应用程序传入到工作内存的。 这意味着你 可以传递任何对象你可以传入一个服务的定位器,或者服务自身。利用新的 from 元素,现在通常是传入一个 Hibernate 会话作为全局变量,允许 from 从命名的 Hibernate 查询拉数据

一个例子可以是一个 Email 服务实例。在你调用规则引擎的集成代码中,你获取你的 emailService 对 象,然后在工作内存中设置它。在 DRL 中,你声明你有一个 EmailService 类型的全局对象,并且给 它命名为 "email"。然后在你的规则推论中,你可以使用如 email.sendSMS(number, message)这样的东 西。想想都是很吊的东西


全局变量不是设计来在规则之间共享数据的,决不能用于这样的目的。规则总是推断和作用于工作内 在的状态,所以,如果你想从规则到规则传递数据,断言数据作为事实到工作内存中

我们强烈反对从你的规则内部设置或改变全局变量的值。 我们建议你总是从你的应用程序中使用工作 内存的接口设置该值

下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的

----请看下方↓↓↓↓↓↓↓

百度搜索 Drools从入门到精通:可下载开源全套Drools教程

深度Drools教程不段更新中:


更多Drools实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值