【问题标题】:Drools trigger one rule per item in list input for StatelessKieSessionDrools 为 StatelessKieSession 的列表输入中的每个项目触发一个规则
【发布时间】:2018-08-28 22:40:10
【问题描述】:

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

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

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

kieStatelessSession.execute(inputList)

我可以通过一次向 kieStatelessSession 发送一个项目来完成这项工作,但我更愿意一次执行所有项目。

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

【问题讨论】:

    标签: drools


    【解决方案1】:

    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
    

    希望对你有帮助,

    【讨论】:

    • 感谢您的回复。我现在倾向于开发自定义解决方案,因为我面临另一个与 permgen 相关的 drools 问题 (stackoverflow.com/questions/52086452/…)。配置简单规则似乎工作量太大。
    猜你喜欢
    • 2016-06-23
    • 2022-09-24
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多