《Drools7.0.0.Final规则引擎教程》第4章 global全局变量

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方法的实现。

具体代码后续会更新到github上:https://github.com/secbr/drools

后语

此系列课程持续更新中,QQ群:593177274,欢迎大家加入讨论。目前国内第一套关于Drools(7)的入门教程《Drools 7 规则引擎入门教程》正在火热录制中,其他更多关于Drools的系列教程也在筹划中,希望大家多多支持。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯IVWEB团队的专栏

动手写 js 沙箱

市面上现在流行两种沙箱模式,一种是使用iframe,还有一种是直接在页面上使用new Function + eval进行执行。殊途同归,主要还是防止一些Hack...

8310
来自专栏技术博客

Asp.Net Web API 2第四课——HttpClient消息处理器

    Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html

893
来自专栏架构师之路

Google-LevelDB简介

LevelDB简介 LevelDB一句话描述 LevelDB是google开发的,一个速度非常块的KV存储库(storage library),它支持字符串的k...

4675
来自专栏大内老A

WCF后续之旅(6): 通过WCF Extension实现Context信息的传递

在上一篇文章中,我们讨论了如何通过CallContextInitializer实现Localization的例子,具体的做法是将client端的culture通...

2067
来自专栏跟着阿笨一起玩NET

ASP.NET中DesignMode属性

参考:http://blog.sina.com.cn/s/blog_4c9da9b50100r4u7.html

1052
来自专栏网络

HttpClient使用心得

做过Java web开发的朋友们,应该大部分都用过Apatch HttpClient工具类库,最近在维护公司一个老项目时,遇到了由于HttpClient使用不当...

3709
来自专栏葡萄城控件技术团队

ASP.NET MVC 5 - 给数据模型添加校验器

在本节中将会给Movie模型添加验证逻辑。并且确保这些验证规则在用户创建或编辑电影时被执行。 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DR...

2117
来自专栏一个爱瞎折腾的程序猿

winform复制文件到指定目录

2391
来自专栏更流畅、简洁的软件开发方式

我的数据访问函数库的源代码(一)—— 共用部分

/* 2008 4 25 更新 */ 我的数据访问函数库的源码。整个类有1400多行,原先就是分开来写的,现在更新后还是分开来发一下吧。 第一部分:内部成员...

1819
来自专栏技术博客

一步一步学Linq to sql(七):并发与事务

为了看起来清晰,我已经事先把所有分类为1产品库存修改为相同值了。然后执行下面的程序:

893

扫码关注云+社区

领取腾讯云代金券