2017-03-02 34 views
0

我有一个在Excel电子表格中有两个规则的决定表。 (这个例子已经大大简化了,我正在使用的那个有更多的规则。)更新决策表中的事实:Drools

enter image description here 第一条规则检查金额是否大于或等于500.如果是,则它将状态设置为400 第二条规则检查状态是否为400.如果是,则它设置消息变量。 问题是,即使设置了顺序,我也无法获得第二条规则。我也必须使用无循环和锁定活动来防止无限循环。

我的目标是让规则自顶而下,后面的规则可能取决于先前规则对事实/对象所做的更改。

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

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; 
     } 

    } 
} 

回答

1

属性锁定导通积极应对在具有相同议程组的规则组中的第一个之后的任何发射。删除此列。

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

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

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

想到规则属性是最后的手段。

-1

请更换以下列方式在H列动作:

目前的解决方案:

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

新的解决方案:

modify(a) { 
    setStatus($param) 
} 
+0

谢谢,但是让这个改变仍然没有触发第二条规则 –

+0

这只是更新事实的替代语法。 – laune