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的一般最佳实践。我会查一查。另一个答案更符合我的要求