Drools: возникли проблемы с обработкой событий drools

Я совсем новичок в слюнях.

Я работаю над приложением, в котором мой движок drools будет получать серию событий каждую секунду. Мне нужно посмотреть, все ли события за последние 10 секунд имеют значение атрибута ниже 10, если условие истинно, мне нужно выполнить некоторую обработку. Вот пример кода, который я пробовал. Пожалуйста, помогите мне понять и решить проблему.

Мой файл правил.....

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


declare Employee 
@role (event)
@expires(10s)
end

// Using timer to ensure rule processing starts only after 10 secs, 
//else processing starts as soon as first event comes in
rule "Test Timer"
no-loop true
10timer(int: 5s)
when
$E : Employee()
$total : Number( doubleValue < 1 ) 
    from accumulate( Employee( Age > 10 ), count() )
then 
   System.out.println(  $E.getName() + " is crossing the threshold of 20");
retract($E);
end

И основной класс

// import classes removed from here...
public class MainClass {

/**
 * @param args
 */
public static void main(String[] args){

    //Create KnowledgeBase...
    KnowledgeBase knowledgeBase = createKnowledgeBase();

    //Create a stateful session
    StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
//  KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(session);
    try {

        // Using random generator to simulate the data.
        int randomInt=0;
        Random randomGenerator = new Random();
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = null; 

        while (true) {
            Thread.sleep(1000);
            date = new Date();
            randomInt = randomGenerator.nextInt(12);

            //Create Facts and insert them      
            Employee emp = new Employee();
            emp.setName("Anurag" + randomInt);
            emp.setAge(randomInt);

            //LOAD THE FACT AND FIREEEEEEEEEEEEEEEEEEE............
            System.out.println(dateFormat.format(date)+ " => Random no " + randomInt);
            session.insert(emp);
            session.fireAllRules();
        } 

    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        session.dispose();
    }
}

    /**
    * Create new knowledge base
    */
private static KnowledgeBase createKnowledgeBase() {
    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
            //Add drl file into builder
    File drl = new File("D:\\eclipse\\worspace\\Research\\misc\\testforall.drl");
    builder.add(ResourceFactory.newFileResource(drl), ResourceType.DRL);
    if (builder.hasErrors()) {
        System.out.println(builder.getErrors().toString());
        //throw new RuntimeException(builder.getErrors().toString());
    }

    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
            //Add to Knowledge Base packages from the builder which are actually the rules from the drl file.
    knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
    KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

    config.setOption( EventProcessingOption.STREAM );
    return knowledgeBase;
}
}

public class Employee {
private String Name;
private int Age;
// getter - setters
}

person user1321332    schedule 09.04.2012    source источник


Ответы (2)


вы проверяли документацию Drools Fusion? Прежде всего, Сотрудник не кажется хорошей идеей для события. События — это значимые изменения состояний чего-либо, связанного с вашим доменом. Таким образом, событием может быть время прибытия Сотрудника в офис или время ухода, но сам Сотрудник является доменной сущностью (или фактом для механизма правил), а не событием. Если вы заинтересованы в использовании временных операторов слияния Drools, я рекомендую вам прочитать о скользящих окнах (временных), которые позволят вам все время видеть, что происходит в последние десять секунд. Для этого не нужно использовать таймеры. Ваше здоровье

person salaboy    schedule 09.04.2012

Вы забыли сказать, что произошло, когда вы запустили его, если вы это сделали.

Если ваш набор сущностей не очень велик, я думаю, что эту проблему можно очень легко решить с помощью базового дистрибутива Drools.

У меня есть похожее на ваше приложение, и оно у меня работает:

rule "Clear only auxiliar fact"
  salience 1
  when
    af: AuxFact()
  then
    DroolsRepository.retractFact(af);
end

rule "Clear auxiliar fact and an old meaningful fact"
  salience 1000
  when 
    af: AuxFact()
    mf: MeaningfulFact()
  then
    if(DroolsRepository.getCurrentTimeMillis() - tmf.getCreationDate().getTime() > 5000){
      DroolsRepository.retractFact(af);
      DroolsRepository.retractFact(mf);
      // YOUR MEANINGFUL CODE
    }
    else{
      DroolsRepository.retractFact(af);}
end

query "getAllFacts"
  $result: Fact()
end

и

// Boot rules re-executing thread.
new Thread(new Runnable(){
  public void run(){
  do{
    kSession.insert(new AuxFact());
    try{
      Thread.sleep(99);}
    catch(InterruptedException e){
      e.printStackTrace();}}
  while(true);}
}).start();

Подобный подход мог бы быть проще и эффективнее.

person 1737973    schedule 27.06.2013