在Drools中,包的概念与java基本相同,区别的地方是Drools的中包不一定与物理路径相对应。包一组规则和相关语法结构,比如引入和全局变量。在同一包下的规则相互之间有一定的关联。

一个包代表一个命名空间,一般来讲针对同一组规则要确保包的唯一性。包名本身是命名空间,并且不以任何方式关联到文件或文件夹。

第四章:规则引擎:包(package)插图

1.1.1 import

Drools的导入语句的作用和在java一样。需要为在规则中使用的对象指定完整路径和类型名字。 Drools会自动从同名的java包中导入类,默认会引入java.lang下面的类。

1.1.2 global 全局变量

global用来定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。通常,可以用来为规则文件提供数据或服务。特别是用来操作规则执行结果的处理和从规则返回数据,比如执行结果的日志或值,或者与应用程序进行交互的规则的回调处理。

全局变量并不会被插入到Working Memory中,因此,除非作为常量值,否则不应该将全局变量用于规则约束的判断中。对规则引擎中的fact修改,规则引擎根据算法会动态更新决策树,重新激活某些规则的执行,而全局变量不会对规则引擎的决策树有任何影响。在约束条件中错误的使用全局变量会导致意想不到的错误。

如果多个包中声明具有相同标识符的全局变量,则必须是相同的类型,并且它们都将引用相同的全局值。

实例代码如下:

规则文件内容:

package com.rules
import com.secbro.drools.model.Risk
import com.secbro.drools.model.Message

global com.secbro.drools.EmailService emailService

rule “test-global”

agenda-group “test-global-group”

when
then
   
Message message = new Message();
    message.setRule(drools.getRule().getName());
    message.setDesc(“to send email!”);
    emailService.sendEmail(message);
end  

测试代码:

@Test
public void testGlobal(){
    KieSession kieSession = this.getKieSession(“test-global-group”);
    int count = kieSession.fireAllRules();
    kieSession.dispose();
    System.out.println(“Fire ” + count  + ” rule(s)!”);
}  

实体类:

public class Message {

    private String rule;

    private String desc;
    // getter/setter
    }  

操作类:

public class EmailService {

    public static void sendEmail(Message message){
        System.out.println(“Send message to email,the fired rule is ‘” + message.getRule()
                + “‘, and description  is ‘” + message.getDesc() + “‘”);
    }
}  

执行之后,打印结果:

Send message to email,the fired rule is ‘test-global’, and description  is ‘to send email!’ Fire 1 rule(s)!

上面的实例完成了一个规则从触发到通过global调用emailService方法的实现。

相关技术视频

CSDN学院:《Drools7规则引擎进阶教程》

CSDN学院:《Drools7规则引擎入门教程》

CSDN学院:《Drools7系列优惠套餐》



第四章:规则引擎:包(package)插图1

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2019/08/02/%e7%ac%ac%e5%9b%9b%e7%ab%a0%ef%bc%9a%e8%a7%84%e5%88%99%e5%bc%95%e6%93%8e%ef%bc%9a%e5%8c%85%ef%bc%88package/