Drools jboss会流口水,多个相同的事实,只有一次触发规则

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

我想执行我的规则和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(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”)
然后
动作动作=新动作();
.... 
结束
我想要的是:

  • 规则1和规则2只执行一条规则,即如果执行了“规则1”,则“规则2”即使满足“规则2”的条件也不会执行

  • 每个规则只执行一次,例如,有2个事实,所有这2个事实都满足“规则1”,但“规则1”只执行一次,而不是2次

  • 我怎样才能实现我的目标? 提前感谢。

    试试这些:

    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
    } 
    
    这样错误就显而易见了。当运行规则时,我们必须预期异常

    您可以使用“无循环”属性。对于每一组事实,如果使用“无循环”属性,则只会触发一次规则,但限制是,如果要修改任何其他规则组中的事实,则这些规则将再次激活

    您可以尝试的一种解决方案是“锁定活动”属性,以避免涉及一个或多个规则的无限执行循环。激活锁定是一种无循环更新


    激活锁定由规则组确定范围,只要该组处于焦点状态,就会防止规则重新触发。它不取决于新的事实或对现有事实的更新,而只取决于议程重点。如果你不操纵团队,这可能是一种选择。

    看看:谢谢史蒂夫和劳恩,这就是我需要的。你说的不是我的问题