使用arraylist元素执行drl文件中的所有规则

时间:2018-02-21 04:21:13

标签: java drools

我有正在处理List内部元素的规则列表。

示例: 学生列表作为drl文件的输入(大小将在40左右)

Drl文件:

规则-1  当学生姓名为'Ravi'时

规则-2-  当学生工资为1000时

规则-3-  当学生大学是IIT时

.......如此(约50条规则)

所以,如果我在所有规则中迭代列表来检查条件,它将降低性能。 是否有可能在所有规则上执行List的元素,以便我的列表只迭代一次。

请告诉我什么是上述案例的最佳解决方案

1 个答案:

答案 0 :(得分:0)

最干净的方法可能是在规则之外迭代你的数组并将它包含的对象插入到会话中:

//Java
List<Student> students = //get the list of Students
KieSession ksession = //create session

for (Student s : students){
    ksession.insert(s);
}
ksession.fireAllRules();

//DRL
rule "rule-1"
when
    Student(name == "Ravi")
then
    //...
end

...

另一个选项是将列表插入到会话中,并有一个规则将迭代元素并插入它们:

//Java
List<Student> students = //get the list of Students
KieSession ksession = //create session

ksession.insert(students);
ksession.fireAllRules();

//DRL
rule "Insert Students"
when
    $l: List()
    $s: Student() from $l
then
    insert($s);
end

rule "rule-1"
when
    Student(name == "Ravi")
then
    //...
end

...

第二种方法的问题在于,如果在会话中获得的不仅仅是List,那么事情就会变得混乱。良好实践表明,将JDK中的类作为事实通常不是一个好主意(当然也有例外)。

希望它有所帮助,