0

Я новичок в 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» не сжигается

ответ

0

Решение прост.

class Counter { 
    private int value; 
    public void inc(){ value++; } 
    public void reset(){ value = 0; } 
    public int getValue(){ return value; } 
} 

Вставьте счетчик факт в рабочие методы памяти и использования inc и reset, когда это целесообразно после добавления $c: Counter() шаблон к правилам.

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 
+0

спасибо за ответ. Не могли бы вы объяснить, где мне нужно объявить этот факт Counter в файле DRL? Поскольку фактические правила я применяю к разным фактам, а в то время часть I должна увеличивать или сбрасывать счетчик. Нужно ли снова объявлять это глобальным.? – Kiran

+0

Обратите внимание, что я написал «Вставить счетчик». См. Мое обновление. - Нет глобалов. – laune

+0

Спасибо за обновление. Я отредактировал контент DRL, пожалуйста, пройдите это и помогите мне в устранении проблемы. Я вставляю ResultFact в рабочую память через java-программу. Другие методы inc и reset работают нормально, и я могу распечатать значение счетчика с помощью метода getValue. Но «rule checkCounterAndProduceAlert» не работает – Kiran