2012-09-18 5 views
1

Suis un novice à Drools et d'essayer le concept de fenêtre coulissante.Drools Fusion fenêtre coulissante échantillon ne fonctionne pas

Mon problème est de détecter si au moins une transaction réussie s'est produite dans 2 événements de ventes. Je reçois toujours la sortie comme "Une vente s'est produite sur 2 événements" même si un tel événement s'est produit ou non.

------------- ---------- DRL

declare Sale 
@role(event) 
end 

rule "Identify more than a single valid sale event" 

//The variable saleHappened would be set to Y if a successful transaction 

when sale: Sale (saleHappened == "Y") over window:length(2) from entry-point MyEntryPoint 

then 

System.out.println("A sale has happened over 2 events"); 

end 

------------- code- ---------

public class DroolsTest { 

    public static final void main(String[] args) { 
     try { 

      // load up the knowledge base 
      KnowledgeBase kbase = readKnowledgeBase(); 

      StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

      WorkingMemoryEntryPoint entryPoint = ksession.getWorkingMemoryEntryPoint("MyEntryPoint"); 


      Sale sale = new Sale(); 

      sale.setSaleHappened("N"); 
      entryPoint.insert(sale); 


      Sale sale2 = new Sale(); 

      sale2.setSaleHappened("N"); 
      entryPoint.insert(sale2); 


      ksession.fireAllRules(); 

      ksession.dispose(); 

     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 


    private static KnowledgeBase readKnowledgeBase() throws Exception { 

     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
     kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); 
     KnowledgeBuilderErrors errors = kbuilder.getErrors(); 
     if (errors.size() > 0) { 
       for (KnowledgeBuilderError error: errors) { 
         System.err.println(error); 
       } 
       throw new IllegalArgumentException("Could not parse knowledge."); 
     } 

     final KnowledgeBaseConfiguration kbConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); 
     kbConfig.setOption(EventProcessingOption.STREAM); 
     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConfig); 
     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
     return kbase; 
    } 

    public static class Sale { 

     public Sale() { 

     } 

     public String getSaleHappened() { 
      return saleHappened; 
     } 

     public void setSaleHappened(String saleHappened) { 
      this.saleHappened = saleHappened; 
     } 

     private String saleHappened; 




    } 

} 

Répondre

1

Ceci est en rapport avec Bug 787118 - Length sliding window keeps all events. Le concept de déclenchement d'événement de fenêtre glissante et comment les événements ne tombent pas de la fenêtre est expliqué dans l'entrée bugzilla.

peut être fixé comme suit:

--------------drl-------------------- 

declare Sale 
@role(event) 
end 

declare window Ticks 
    Sale() 
     over window:length(5) 
     from entry-point MyEntryPoint 
end 


rule "More than 2 sale suceess in 5 events" 
when  Number($cnt : intValue,intValue > 2) 
from accumulate(Sale (saleHappened == "Y") from window Ticks, count(1)) 
then 
    System.out.println("A sale has happened over " + $cnt +" events"); 
end 
+1

Salut, j'ai une question connexe. Je vois que dans le code java, nous avons besoin de 'insert()' d'interet et d'invoquer 'ksession.fireAllRules()'. Mais ce n'est pas du vrai ESP. Je devrais être en mesure d'insérer des événements à un moment ultérieur également. est-il possible de continuer à ajouter des événements même après avoir appelé 'ksession.fireAllRules()'? - Merci, Vimal – weima