You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:36:02