2012-04-09 2 views
0

Я совершенно новый, чтобы слюни.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 
} 

ответ

2

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

1

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

Если ваши объекты не очень большие, я думаю, что эта проблема может быть решена очень легко с базовым распределением 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(); 

Аналогичный подход может быть более простым и эффективным.

Смежные вопросы