流口水为StatelessKieSession的列表输入中的每个项目触发一条规则

时间:2018-08-28 22:40:11

标签: drools

我正在使用决策表,并且希望为每个输入项触发一条规则。

我正在使用决策,将Sequential = true设置为,并将所有规则定义为同一ACTIVATION-GROUP的一部分。

当我使用下面的命令触发drools规则引擎时,它只会评估第一个输入项,而其他输入项将被忽略。我想要的行为是每个输入项最多评估1条规则(规则由显着性定义)。

kieStatelessSession.execute(inputList)

我可以通过一次将一个项目发送到kieStatelessSession来使它正常工作,但是我希望一次执行所有项目。

我正在使用Drools verison 6.5.0.FINAL和Java 7。

1 个答案:

答案 0 :(得分:0)

您想要实现的目标在Drools中没有开箱即用的支持。如果您希望针对每个事实对规则进行一次评估,则需要自己编写代码。

一种方法可能是用另一种事实来标记何时处理其中一个输入:

declare Marker
  fact : Object
end

//Bellow are the rules that should be coming from your decision table.
//Each rule will do whatever it needs to do, and then it will create a 
//Marker fact for the fact that was processed.
//These rules now include a "not" Conditional Element to avoid a fact to be
//evaluated more than once.

rule "Rule 1"
salience 100
when 
  $fact: Object(...)   //your conditions
  not Marker(fact == $fact)
then
  //...   Your logic
  insert(new Marker($fact)); 
end

...


rule "Rule 50"
salience 50
when 
  $fact: Object(...)   //your conditions
  not Marker(fact == $fact)
then
  //...   Your logic
  insert(new Marker($fact)); 
end

希望有帮助,