zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Drools rule语法之全局变量(global variables)详解编程语言

编程语言 详解 语法 variables 全局变量 rule global Drools
2023-06-13 09:20:44 时间

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 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 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 信息之输出一个。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15232.html

cjava