Drools中是否可对List类型全局变量在规则LHS执行contains等匹配操作
你编写的规则逻辑为迭代全局List中的每一个元素,每匹配到一个Task类型元素就触发一次规则。如果规则未正常触发,通常是因为Drools不会主动监听全局变量的变更,全局List赋值完成后需要主动调用fireAllRules()触发规则匹配;如果你的需求是只要List中存在Task就触发一次,而非逐元素多次触发,添加exists关键字即可。
可行实现方案
方案1:使用exists关键字判断全局List中存在指定类型元素
global java.util.List myGlobalList; dialect "mvel" rule "checker" when // 只要List中存在至少一个Task就触发一次规则 exists(Task() from myGlobalList) then System.out.println(myGlobalList); end
如果需要匹配指定属性的Task,比如id为1的Task,调整条件为:exists(Task(id == 1) from myGlobalList)
方案2:使用contains关键字判断对象是否在全局List中
如果工作内存中已经插入了Task实例,需要判断该实例是否包含在全局List中,写法如下:
global java.util.List myGlobalList; rule "check_task_in_list" when $task: Task() myGlobalList contains $task then System.out.println("匹配到List中存在的Task:" + $task); end
方案3:使用in关键字判断属性是否在全局List中
如果全局List存储的是属性值(比如String类型的任务名称白名单),需要判断Task的属性是否在名单内,写法如下:
global java.util.List myGlobalList; // 此处List存储的是允许的任务名称字符串 rule "check_task_name_in_allow_list" when $task: Task(taskName in myGlobalList) then System.out.println("任务名称在白名单内:" + $task.getTaskName()); end
注意事项
- 全局变量的变更不会被Drools引擎自动感知,List修改后需要主动调用
fireAllRules()才能触发规则重新匹配。 - 如果List是运行时频繁变更的,更推荐把List内的元素作为普通Fact插入Drools工作内存,由引擎自动感知数据变更触发规则,性能和可靠性更高。
内容的提问来源于stack exchange,提问作者Alex Vulchev
相关产品推荐
相关产品推荐

