最近遇到一个同学说想实现一个在一个规则文件中的多个规则中将上一个规则的执行输出作为下一个规则的执行条件,实现如下效果
login_rule_1 执行后给amount赋值为 10 login_rule_2 执行时如果 amount = 10 则将 flag 赋值为 true
package com.drools.rule.req
import com.drools.rule.req.LoginActionReq
rule login_rule_1
when
$s:LoginActionReq(loginNum==1)
then
$s.amount=10;
update($s);
end
rule login_rule_2
when
$s:LoginActionReq(amount==10)
then
$s.flag=true;
System.out.println($s.flag);
update($s);
end
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("package com.drools.rule.req").append("\n");
stringBuilder.append("import com.drools.rule.req.LoginActionReq").append("\n");
stringBuilder.append("rule login_rule_1 ").append("\n");
stringBuilder.append("when\n" + " $s:LoginActionReq(loginNum==1) ").append("\n");
stringBuilder.append("then\n" + " $s.amount=10; ").append("\n");
stringBuilder.append("update($s); ").append("\n");
stringBuilder.append("end ").append("\n");
stringBuilder.append("rule login_rule_2 ").append("\n");
stringBuilder.append("when\n" + " $s:LoginActionReq(amount==10) ").append("\n");
stringBuilder.append("then\n" + " $s.flag=true; ").append("\n");
stringBuilder.append("System.out.println($s.flag); ").append("\n");
stringBuilder.append("update($s); ").append("\n");
stringBuilder.append("end ").append("\n");
System.out.println(stringBuilder.toString());
KieHelper helper = new KieHelper();
helper.addContent(stringBuilder.toString(), ResourceType.DRL);
KieSession kSession = helper.build().newKieSession();
LoginActionReq actionReq = new LoginActionReq();
actionReq.setLoginActionType("LOGIN");
actionReq.setLoginNum(1);
System.out.println("req : "+ JSON.toJSONString(actionReq));
kSession.insert(actionReq);
kSession.fireAllRules();
kSession.dispose();
System.out.println("resp : "+ JSON.toJSONString(actionReq));
}
执行main方法得到以下结果
期间出现 login_rule_2 一直无法执行的问,最后发现是因为 规则中加了 lock-on-active true 这个东西,去掉就好了,相关代码已提交,有兴趣的可以联系我获取了
补充一句,加微信别老是您您您的,都是打工人,不必这么客气,我也才18啊哈哈
也请大家关注下博客谢谢