【问题标题】:Update facts in Decision Table : Drools更新决策表中的事实:Drools
【发布时间】:2017-04-25 17:43:15
【问题描述】:

我在 Excel 电子表格中有一个流口水决策表,其中包含两条规则。 (这个例子已经大大简化了,我正在使用的那个有更多的规则。)

第一条规则检查金额是否大于或等于 500。如果是,则将状态设置为 400。 第二条规则检查状态是否为 400。如果是,则设置消息变量。 问题是,即使设置了顺序,我也无法触发第二条规则。我还必须使用 no-loop 和 lock-on-active 来防止无限循环。

我的目标是让规则自上而下地触发,之后的规则可能取决于早期规则对事实/对象所做的更改。

这个问题有解决办法吗? 任何帮助将不胜感激,谢谢!

package com.example;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class SalaryTest {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-dtables");

            Salary a = new Salary();
            a.setAmount(600);

            kSession.insert(a);
            kSession.fireAllRules();


        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public static class Salary{
        private String message;
        private int amount;
        private int status;

        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
        public int getAmount() {
            return amount;
        }
        public void setAmount(int amount) {
            this.amount = amount;
        }
        public int getStatus() {
            return status;
        }
        public void setStatus(int status) {
            this.status = status;
        }

    }
}

【问题讨论】:

    标签: drools rules


    【解决方案1】:

    属性 lock-on-active 会在具有相同议程组的规则组的第一次之后取消任何触发。删除此列。

    不打算让规则按特定顺序触发。编写准确描述事实状态的逻辑,因为它应该触发规则。可能你必须写

    rule "set status"
    when
      $s: Salary( amount >= 500.0 && < 600.0, status == 0 )
    then
      modify( $s ){ setStatus( 400 ) }
    end
    

    避免发生多个状态设置或仅发生正确的设置。但你会发现你的规则可能更直言不讳,更容易阅读。

    认为规则属性是最后的手段。

    【讨论】:

      【解决方案2】:

      请按以下方式替换H列中的动作:

      目前的解决方案:

      a.setStatus($param);update(a);
      

      新解决方案:

      modify(a) {
          setStatus($param)
      }
      

      【讨论】:

      • 谢谢,但做出改变仍然不会触发第二条规则
      • 这只是更新事实的另一种语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      相关资源
      最近更新 更多