更新决策 Table 中的事实:Drools
Update facts in Decision Table : Drools
我在 excel 电子表格中有一个流口水决定 table,有两条规则。 (这个例子已经大大简化了,我正在使用的那个有更多的规则。)
第一条规则检查金额是否大于或等于 500。如果是,则将状态设置为 400。
第二条规则检查状态是否为 400。如果是,则设置消息变量。
问题是,即使设置了顺序,我也无法触发第二条规则。我还必须使用 no-loop 和 lock-on-active 来防止无限循环。
我的目标是让规则自上而下触发,之后的规则可能取决于早期规则对 fact/object 所做的更改。
这个问题有解决办法吗?
任何帮助将不胜感激,谢谢!
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;
}
}
}
请将H列中的动作替换为以下方式:
当前解决方案:
a.setStatus($param);update(a);
新解决方案:
modify(a) {
setStatus($param)
}
属性 lock-on-active 取消在具有相同议程组的规则组中的第一个之后的任何触发。删除此列。
不打算按特定顺序触发规则。编写准确描述事实状态的逻辑,因为它应该触发规则。可能你必须写
rule "set status"
when
$s: Salary( amount >= 500.0 && < 600.0, status == 0 )
then
modify( $s ){ setStatus( 400 ) }
end
避免发生不止一种状态设置或只发生正确的设置。但是您会发现您的规则可能更加直率且更易于阅读。
认为规则属性是最后的手段。
我在 excel 电子表格中有一个流口水决定 table,有两条规则。 (这个例子已经大大简化了,我正在使用的那个有更多的规则。)
我的目标是让规则自上而下触发,之后的规则可能取决于早期规则对 fact/object 所做的更改。
这个问题有解决办法吗? 任何帮助将不胜感激,谢谢!
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;
}
}
}
请将H列中的动作替换为以下方式:
当前解决方案:
a.setStatus($param);update(a);
新解决方案:
modify(a) {
setStatus($param)
}
属性 lock-on-active 取消在具有相同议程组的规则组中的第一个之后的任何触发。删除此列。
不打算按特定顺序触发规则。编写准确描述事实状态的逻辑,因为它应该触发规则。可能你必须写
rule "set status"
when
$s: Salary( amount >= 500.0 && < 600.0, status == 0 )
then
modify( $s ){ setStatus( 400 ) }
end
避免发生不止一种状态设置或只发生正确的设置。但是您会发现您的规则可能更加直率且更易于阅读。
认为规则属性是最后的手段。