16.6. DRL 中的全局变量
DRL 文件中的全局变量通常会为规则提供数据或服务,如规则后果中使用的应用程序服务,并返回规则中的数据,如规则中添加的日志或值等。您可以通过 KIE 会话配置或 REST 操作在决策引擎的工作内存中设置全局值,声明 DRL 文件中的规则以外的全局变量,然后在规则的操作(然后
)部分使用。对于多个全局变量,请在 DRL 文件中使用单独的行。
以下示例演示了决策引擎的全局变量列表配置以及 DRL 文件中的对应全局变量定义:
决策引擎的全局列表配置示例
List<String> list = new ArrayList<>(); KieSession kieSession = kiebase.newKieSession(); kieSession.setGlobal( "myGlobalList", list );
包含规则的全局变量定义示例
global java.util.List myGlobalList; rule "Using a global" when // Empty then myGlobalList.add( "My global list" ); end
不要使用全局变量在规则中建立条件,除非全局变量具有恒定的不可变值。全局变量不会插入到决策引擎的工作内存中,因此决策引擎无法跟踪变量的值更改。
不要使用全局变量在规则间共享数据。规则始终原因并响应正常工作的内存状态。因此,如果要将数据从规则传递给规则,请向决策引擎的工作内存中断言数据。
全局变量的用例可能是电子邮件服务的实例。在调用决策引擎的集成代码中,您可以获取您的 emailService
对象,然后在决策引擎的工作内存中设置它。在 DRL 文件中,您声明有一个全局类型 emailService
,并为它指定名称 "email"
,然后在规则结果中,您可以使用电子邮件等操作 ,如 email.sendSMS(number)
。
如果您在多个软件包中声明具有相同标识符的全局变量,则必须使用相同类型设置所有软件包,以便它们都引用同一全局值。