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相关文章
- Java基础学习笔记五 Java基础语法之面向对象详解编程语言
- python构造函数示例详解编程语言
- python读取windows系统信息详解编程语言
- 将Python源代码导出成HTML文件并带语法高亮详解编程语言
- Java实现对cookie的操作(增删改查)详解编程语言
- javaweb学习总结(十五)——JSP基础语法详解编程语言
- XML中的DTD语法详解编程语言
- Java学习笔记之三十一详解Java8 lambda表达式编程语言
- Java学习笔记之七java函数的语法规则总结详解编程语言
- Scalaz(41)- Free :IO Monad-Free特定版本的FP语法详解编程语言
- Java程序员必须掌握的8大排序算法详解编程语言
- uploadify struts2实现图片上传详解编程语言
- Drools规则文件的语法属性详解编程语言
- Drools语法篇之Global全局变量详解编程语言
- AspectJ切入点语法详解编程语言
- java8 按对象属性值分组详解编程语言
- Java8从对象列表中取出某个属性的列表详解编程语言
- 获取请求参数详解编程语言
- ABAP程序中的事件详解编程语言
- 程序新能优化-SQL优化详解编程语言
- js 语法理解工具babel详解编程语言
- jquery插件实现瀑布流详解编程语言
- REUSE_ALV_GRID_DISPLAY_LVC-可编辑单元格详解编程语言
- ABAP 文本写入详解编程语言
- SAP MM PR的审批策略中设置经过了审批的PR就不能再被修改详解编程语言