Drools rule语法之全局变量(global variables)

Drools rule语法之全局变量(global variables)

Drools规则文件中的全局变量(global variables)是规则文件代码与java代码之间相互交互的桥梁,我们可以利用全局变量让规则文件中的程序使用java代码中的基本变量、缓存信息或接口服务等等。

   基本语法:

      global  类型 变量名

  例如:

global java.util.List list

 


  java设置全局变量:

   public void setGlobal(final String identifier,final Object value)

  例如:

  在java代码中设置全局变量list值:

   List<UUID> list = new ArrayList<>();
   statelessKieSession.setGlobal("list", list);

    java中对list设值后,规则文件代码就可以访问list中的数据了。


  java中获取全局变量:

    public Object getGlobal(final String identifier) 

    public Globals getGlobals() 



  全局变量与fact不一样:

     对规则引擎中的fact修改,规则引擎根据算法会动态更新决策树,重新激活某些规则的执行,而全局变量不会对规则引擎的决策树有任何影响。
    



  全局变量的一般用法:

    全局变量在规则文件中的作用和java代码中的作用差不多,我们可以让它承担规则文件代码和java代码之间沟通的桥梁。

   在规则文件中,我们可以用全局变量表示规则文件中的不变的魔数:

  例如:
package com.beaver.drools.example.fact
import java.util.UUID
import com.beaver.drools.common.model.RuleResult

global Integer MAX_AGE
rule "GlobalVariableMagicNumberExample"

when
    $p : Person(age > MAX_AGE)
then
    $p.getRuleResultDetail().add(RuleResult.REJECT,"age > "+ MAX_AGE);
end


package com.beaver.drools.example.start;

import com.beaver.drools.example.fact.Person;
import com.beaver.drools.util.KieSessionUtil;
import org.kie.api.runtime.StatelessKieSession;

import java.nio.charset.StandardCharsets;

/**
 * Created by beaver on 2017/3/27.
 */
public class GlobalVariableMagicNumberExample {
    private static final int MAX_AGE = 88;
    
    public static void main(String[] args) {
        KieSessionUtil kieSessionUtil = new KieSessionUtil();
        kieSessionUtil.addFromClassPath("/rules/test/GlobalVariableMagicNumberExample.drl", StandardCharsets.UTF_8.name());
        StatelessKieSession statelessKieSession = kieSessionUtil.build().newStatelessKieSession();
        
        statelessKieSession.setGlobal("MAX_AGE",MAX_AGE );
    
        Person person = new Person();
        person.setAge(89);
        System.out.println(person);
        KieSessionUtil.excuteInsertObject(statelessKieSession, person);
        System.out.println(person);
        
    }
}


java代码中:
private static final int MAX_AGE = 88;

statelessKieSession.setGlobal("MAX_AGE",MAX_AGE );

规则文件代码:

$p : Person(age > MAX_AGE)


 规则文件可以使用java中提供的信息,同样,规则文件也可以向java程序提供的变量写入信息:

 例如:
package com.beaver.drools.example.fact
import java.util.UUID

global java.util.List list
global com.beaver.drools.example.service.impl.EmailServiceImpl emailService
rule "GlobalVariablesExample"

when
    eval(true)
then
    list.add(UUID.randomUUID());
    emailService.sendSMS("send ");

end

规则文件中代码对list写入了某些值,看java代码中的执行结果:

public class GlobalVariableExample {
    private static EmailServiceImpl emailService = new EmailServiceImpl();
    
    public static void main(String[] args) {
        KieSessionUtil kieSessionUtil = new KieSessionUtil();
        kieSessionUtil.addFromClassPath("/rules/test/GlobalVariablesExample.drl", StandardCharsets.UTF_8.name());
        StatelessKieSession statelessKieSession = kieSessionUtil.build().newStatelessKieSession();
        
        List<UUID> list = new ArrayList<>();
        statelessKieSession.setGlobal("list", list);
        statelessKieSession.setGlobal("emailService", emailService);
        
        System.out.println(list);
        
        KieSessionUtil.excuteInsertObject(statelessKieSession, new Object());
        KieSessionUtil.excuteInsertObject(statelessKieSession, new Object());
        System.out.println(list);
    }
}

 执行结果:

[]
sendSms:send 
sendSms:send 
[62e765d2-4924-46ec-89b3-83819a1cd22a, f64b0685-9b32-4493-9e13-41c53a8805b3]

输出了[62e765d2-4924-46ec-89b3-83819a1cd22a, f64b0685-9b32-4493-9e13-41c53a8805b3]

Process finished with exit code 0


  全局变量可以设置为java代码中的接口变量,以让规则文件调用java中的服务:

   在规则文件代码中,我们可以利用全局变量调用java服务接口实现。

 例如java接口实现(远程RPC一样可以):


package com.beaver.drools.example.service.impl;

import com.beaver.drools.example.fact.Person;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by beaver on 2017/3/27.
 */
public class PersonServiceImpl {
    
    public List<Person> queryPersons() {
        List<Person> personList = new ArrayList<>();
        Person person = new Person();
        person.setAge(55);
        personList.add(person);
        Person person2 = new Person();
        person2.setAge(30);
        
        return personList;
    }
    
    public int savePerson(List<Person> personList) {
        System.out.println("save persons" + personList);
        return personList.size();
    }
    
}

 规则文件:

package com.beaver.drools.example.fact
import com.beaver.drools.example.service.impl.PersonServiceImpl
import java.util.Arrays
import java.util.List

global PersonServiceImpl personService
rule "GlobalVariableJavaServiceExample"

when
    Object()
    $p : Person(age > 44) from personService.queryPersons()
then
    personService.savePerson(Arrays.asList( $p));
end


使用的java服务见:

java代码:

package com.beaver.drools.example.start;

import com.beaver.drools.example.service.impl.PersonServiceImpl;
import com.beaver.drools.util.KieSessionUtil;
import org.kie.api.runtime.StatelessKieSession;

import java.nio.charset.StandardCharsets;

/**
 * Created by beaver on 2017/3/27.
 */
public class GlobalVariableJavaServiceExample {
    private static PersonServiceImpl personService = new PersonServiceImpl();
    
    public static void main(String[] args) {
        KieSessionUtil kieSessionUtil = new KieSessionUtil();
        kieSessionUtil.addFromClassPath("/rules/test/GlobalVariableJavaServiceExample.drl", StandardCharsets.UTF_8.name());
        StatelessKieSession statelessKieSession = kieSessionUtil.build().newStatelessKieSession();
        
        statelessKieSession.setGlobal("personService", personService);
        statelessKieSession.execute(new Object());
    }
}

控制台输出:

save persons[Person{name='null', age=55, address=null, exGirlfriend=null, message='null', ruleResultDetail=RuleResultDetail{ruleResultDetailInfo={}}}]


Process finished with exit code 0




java服务提供了两个人,但满足条件的就一个,所以save 信息之输出一个。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dreamer who

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值