我对Drools是一个新手,我将在一个需求中获得一批事实(银行账户信息)。当连续三个小账户(年龄
以下规则未触发
rule checkCounterAndProduceAlert when
b: ResultFact( value > 2 )
then
System.out.println("Alert****");
end
Here is the DRL full content of DRL file
package com.ys.drools.rules
import com.ys.drools.facts.*;
rule checkCounterAndProduceAlert
no-loop true
when
b: ResultFact( value > 2 )
then
System.out.println("Alert****");
end
rule checkSeriesOfMinorAccount when
a : AccountHolder( age < 16 )
b : ResultFact()
then
b.inc();
update(b);
System.out.println("Incrementing count since minor account appered");
System.out.println("***********************************************");
System.out.println(b.getValue());
end
rule checMajorAccount when
a : AccountHolder( age >16 )
b :ResultFact()
then
b.reset();
update(b);
System.out.println("Making count zero since major account appered");
System.out.println(b.getValue());
end
下面是Java类,它将加载3个次要帐户并测试应用程序
package com.ys.drools.data.loader;
import java.util.ArrayList;
import java.util.List;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ys.drools.facts.AccountHolder;
import com.ys.drools.util.BankAccountUtilService;
import com.ys.drools.util.DroolsGlobalUtil;
public class Test {
private BankAccountUtilService service;
private KieContainer kieContainer;
private KieSession kieSession;
private static Logger log = LoggerFactory
.getLogger(Test.class);
private List<AccountHolder> accountHolders=new ArrayList<AccountHolder>();
public Test(){
kieContainer= KieServices.Factory.get().getKieClasspathContainer();
kieSession = kieContainer.newKieSession("BankAccountSession");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test=new Test();
List<AccountHolder> aList=test.fillAccountHolderList();
ResultFact fact=new ResultFact();
test.kieSession.insert(fact);
for(int i=0;i<aList.size();i++){
test.kieSession.insert(aList.get(i));
test.kieSession.fireAllRules();
}
}
public List<AccountHolder> fillAccountHolderList(){
List<AccountHolder> accountHolders=new ArrayList<AccountHolder>();
AccountHolder a1=new AccountHolder("Karun", 12);
AccountHolder a2=new AccountHolder("kumar", 12);
AccountHolder a3=new AccountHolder("rakesh", 10);
accountHolders.add(a1);
accountHolders.add(a2);
accountHolders.add(a3);
return accountHolders;
}
}
请提供解决方案。运行测试类时的输出
Incrementing count since minor account appered
***********************************************
1
Incrementing count since minor account appered
***********************************************
2
Incrementing count since minor account appered
***********************************************
3
Making count zero since major account appered
0
即使在值为之后(“警报****”)也不会显示
解决方案很简单。
class Counter {
private int value;
public void inc(){ value++; }
public void reset(){ value = 0; }
public int getValue(){ return value; }
}
将计数器事实插入工作内存,并在规则中添加一个$c:Counter()模式后,在适当的情况下使用方法inc和reset。
rule checkCounterAndProduceAlert when
Counter( value == 3 )
then
System.out.println("Alert****");
end
您可能需要说明是否应在连续未成年人的第六、第九、...帐户之后发出另一个警报。
编辑
您还可以在DRL文件中声明并插入:
declare Counter
value : int
end
rule "insert counter"
salience 999999
when
not Counter()
then
insert( new Counter() );
end
我对口水很陌生,从基础开始。这是一个设置; > 有一些规则文件 不同文件中的规则属于不同的议程组 所有规则都基于同一事实 在我的单元测试中,我获得了一个特定的“议程组”,设置焦点(
我对drools和KIE服务器是新手。我遇到了一个问题,即如何通过触发规则RHS(then action)在工作记忆中插入新的事实,然后通过这些动态插入的事实激活其他规则。 我所期望的是,当BaseFeature从外部插入工作内存并激活RuleOne时,在RuleOne内部“然后”它将插入新的事实RuleResult,并希望激活RuleTwo,但它没有激活RuleTwo,只是RuleOne被激活了
我对商业规则的世界还很陌生,但我想我已经理解了Drools Expert和Drools Guvnor的概念,但我仍然有点困惑,与Expert相比,到底是如何/何时/为什么使用Guvnor的。而且,无论他们是相互排斥,还是有能力,甚至更愿意并肩工作。下面是一些让我感到困惑的突出主题,以及我关注的问题背后的一些解释,主要集中在应用程序的可维护性上。 Guvnor是否具有Expert plus more
我正在做一个我想在firebase实时数据库上运行的项目。我用以下格式创建了一个数据库设置: 我的安全规则如下所示: 我试图存档,每个人都可以阅读“马”、“图像”和“视频”中的详细信息,但只有经过身份验证的用户才能在“马”、“图像”和“视频”中添加自己的条目(由firebase auth提供的用户ID检查)。 我的第一个问题是:我应该把“图像”和“视频”作为“马”的子对象吗?如果我能为马写一条读写
我对口水有点陌生,我想在一个项目中了解更多,所以我在eclipse上用口水做了一个简单的程序。工作流程非常简单,我有一个珠宝产品模型,对于每件珠宝,我根据名称申请一个折扣。 这很好,但我确实希望看到事实列表,以及每个触发规则使用的事实。我有这个: 规则。日间行车灯 型号。Product.java 主要的DroolsTest。Java语言 输出: 我想要这样的东西: 有可能吗?我检查了Working
我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例