Drools jboss会流口水,多个相同的事实,只有一次触发规则
我想执行我的规则和java代码,比如:Drools jboss会流口水,多个相同的事实,只有一次触发规则,drools,Drools,我想执行我的规则和java代码,比如: Fact fact1 = new Fact(); fact1.setName("name1"); fact1.setValue("chn"); .... Fact fact2 = new Fact(); fact2.setName("name2"); fact2.setValue("chn"); .... List<Fact> facts = new ArrayList<Fact>(); facts.add(f
Fact fact1 = new Fact();
fact1.setName("name1");
fact1.setValue("chn");
....
Fact fact2 = new Fact();
fact2.setName("name2");
fact2.setValue("chn");
....
List<Fact> facts = new ArrayList<Fact>();
facts.add(fact1);
facts.add(fact2);
ksession.execute(facts);
my rules like :
rule "rule1"
when
$partFact:Fact(value=="chn")
then
Action action = new Action();
....
end
rule "rule2"
when
$partFact:Fact(name=="name1")
then
Action action = new Action();
....
end
fact1=新事实();
事实1.集合名(“名称1”);
事实1.设定值(“chn”);
....
事实事实2=新事实();
事实2.设定名称(“名称2”);
事实2.设定值(“chn”);
....
列表事实=新的ArrayList();
事实。添加(事实1);
事实。添加(事实2);
执行(事实);
我的规则是:
规则“规则1”
什么时候
$partFact:Fact(值=“chn”)
然后
动作动作=新动作();
....
结束
规则“规则2”
什么时候
$partFact:Fact(name==“name1”)
然后
动作动作=新动作();
....
结束
我想要的是:
rule "rule1"
when
exists Fact(value=="chn")
then
Action action = new Action();
....
end
rule "rule2"
when
not Fact(value=="chn")
exists Fact(name=="name1")
then
Action action = new Action();
....
end
一条规则阻止执行另一条规则可能是沉默异常的症状。 将规则执行包装到catch子句中。我调试了一个案例,其中一个规则执行阻止了其他规则的执行,但这是因为在规则执行中抛出了一些东西,异常停止了规则执行链,并且异常被捕获在代码的其他地方。长话短说,像这样隔离执行:
try {
kieSession.fireAllRules();
} catch (Exception e) {
LOGGER.error("Error on rules execution", e);
... re-throw or manage the exception
}
这样错误就显而易见了。当运行规则时,我们必须预期异常 您可以使用“无循环”属性。对于每一组事实,如果使用“无循环”属性,则只会触发一次规则,但限制是,如果要修改任何其他规则组中的事实,则这些规则将再次激活
您可以尝试的一种解决方案是“锁定活动”属性,以避免涉及一个或多个规则的无限执行循环。激活锁定是一种无循环更新
激活锁定由规则组确定范围,只要该组处于焦点状态,就会防止规则重新触发。它不取决于新的事实或对现有事实的更新,而只取决于议程重点。如果你不操纵团队,这可能是一种选择。看看:谢谢史蒂夫和劳恩,这就是我需要的。你说的不是我的问题