Java 流口水永远正确规则只触发一次

Java 流口水永远正确规则只触发一次,java,drools,Java,Drools,我有以下两条规则: rule "challenge 1" salience 10 when ClientTransaction(amount < 30) then challenge.setChallenge("challenge1"); end rule "challenge 2" salience 0 when eval( true ) then challenge.setChalleng

我有以下两条规则:

rule "challenge 1" salience 10
    when
        ClientTransaction(amount < 30)
    then
        challenge.setChallenge("challenge1");
end

rule "challenge 2" salience 0
    when
        eval( true )
    then
        challenge.setChallenge("challenge2");
end
以下是ClientTransaction类:


公共类ClientTransaction{
私有字符串id;
私人串商;
私人双倍金额;
公共客户端事务(){
}
公共客户端交易(字符串id、字符串商户、双倍金额){
this.id=id;
this.merchant=商户;
这个。金额=金额;
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getMerchant(){
退货商户;
}
公共商户(字符串商户){
this.merchant=商户;
}
公共双getAmount(){
退货金额;
}
公共无效设置金额(双倍金额){
这个。金额=金额;
}
}
以下是Challenge2课程:


公开课挑战2{
私人字符串挑战;
公开挑战2(){
}
公开挑战2(字符串挑战){
这个。挑战=挑战;
}
公共字符串getChallenge(){
回归挑战;
}
公共无效设置质询(字符串质询){
这个。挑战=挑战;
}
}
当我多次调用ComputeCallengedRoolsRuleSimplementation.ComputeCallenge(数量<30)时,它确实会按预期多次返回带有“challenge1”值的challence对象

但是,当我多次调用ComputeCallengedRoolsRuleSimplementation.ComputeCallenge(数量>=30)时,第一次它确实返回一个“challenge2”值,但随后每次它都返回一个带有空值的challenge2对象

我做错什么了吗


谢谢

我假设您仅在发生ClientTransaction事件时才想触发挑战2规则。只需在drool规则的when部分调用默认构造函数,就可以根据事件的发生情况对规则添加无条件检查。尝试更改挑战2的规则,如下所示:

rule "challenge 2" salience 0
    when
        ClientTransaction()
    then
        challenge.setChallenge("challenge2");
end

此外,不建议在drools规则中过多地使用
eval
。要了解有关最佳做法的更多信息,请查看以下文档中的说明:

无法通知引擎全局变量的值更改,也无法跟踪其更改。在约束中不正确使用全局变量 可能会产生令人惊讶的结果-以糟糕的方式令人惊讶。

[……]

Globals不是为在规则之间共享数据而设计的,它们应该 千万不要用于那个目的。规则总是理性的,并对规则作出反应 工作内存状态,因此如果要在规则之间传递数据, 将数据作为事实断言到工作内存中

强烈反对在规则内部设置或更改全局值。我们建议您始终从设置值 您的应用程序使用工作内存接口


我只是从drools开始,我不知道“工作记忆接口”,全球的最佳实践和drools的一般最佳实践。我会查一查。另一个答案更符合我的要求