14.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, message) 等操作。
如果您在多个软件包中使用相同标识符声明全局变量,则必须使用同一类型设置所有软件包,以便它们引用相同的全局值。