Я новичок в Drools и работаю над требованием, когда я получу партию фактов (информация BankAccount). Я должен дать предупреждение, когда три последовательных младших счета (возраст < 16) вставлены в рабочую память сеанса. Я попытался сохранить глобальную переменную и увеличил ее при добавлении небольшой учетной записи. Но я не могу определить правило, основанное на глобальном значении счетчика, с помощью которого я должен доставить предупреждающее сообщение. Ниже вы найдете DRL-файл и предоставите решение для этого.Как поддерживать глобальный счетчик 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
(«Alert ****») не отображается даже после значения> 2. правило «checkCounterAndProduceAlert» не сжигается
спасибо за ответ. Не могли бы вы объяснить, где мне нужно объявить этот факт Counter в файле DRL? Поскольку фактические правила я применяю к разным фактам, а в то время часть I должна увеличивать или сбрасывать счетчик. Нужно ли снова объявлять это глобальным.? – Kiran
Обратите внимание, что я написал «Вставить счетчик». См. Мое обновление. - Нет глобалов. – laune
Спасибо за обновление. Я отредактировал контент DRL, пожалуйста, пройдите это и помогите мне в устранении проблемы. Я вставляю ResultFact в рабочую память через java-программу. Другие методы inc и reset работают нормально, и я могу распечатать значение счетчика с помощью метода getValue. Но «rule checkCounterAndProduceAlert» не работает – Kiran