2013-09-30 1 views
1

J'essaie d'écrire une règle pour un événement qui doit vérifier si quelque chose se produit pendant une fenêtre temporelle après qu'un autre événement se soit produit. Au moment où le code ressemble à ceci (il fonctionne correctement):comment écrire des règles temporelles dynamiques dans drools-fusion

rule "Detect BPM reseed not starting when requested from Mart" 
     when 
      $martDailyRefreshRequestedEvent: MessageSentEvent(
       $correlationId: correlationId, 
       $when: timestamp, 
       messageTypeName == "MartDailyRefreshCompletedEvent") 
        from entry-point "mart" 
      not (MessageHandleStartedEvent(
        this after[0ms, 30s] $martDailyRefreshRequestedEvent, 
        correlationId == $correlationId, 
        messageTypeName == "MartDailyRefreshCompletedEvent") 
          from entry-point "bpm") 
     then 
      notifier.notify("BPM not responding to MartDailyRefreshCompletedEvent quick enough", 
       String.format(
        "At **%s** Mart sent out a **MartDailyRefreshCompletedEvent**.\n\n**BPM** was supposed to react to it within **30 seconds**.", 
        $when)); 
    end 

Au moment où le 30s est efficacement codé en dur. J'ai lu que si vous voulez paramétrer des règles, vous devez utiliser d'autres faits affirmés dans la base de connaissances, mais je ne peux pas comprendre comment le faire pour les règles temporelles. Donc: Comment puis-je 'configurer' le 30s dans ces règles afin que je puisse changer la valeur en dehors de l'application? Quelque chose comme ceci: MessageHandleStartedEvent(this after [ $duration ] ...

Répondre

0

Vous pouvez utiliser des modèles afin de fournir le 30 codés en dur de Drools extérieurs.

template dynamicTimer 
rule "Detect BPM reseed not starting when requested from Mart" 
    when 
     $martDailyRefreshRequestedEvent: MessageSentEvent(
      $correlationId: correlationId, 
      $when: timestamp, 
      messageTypeName == "MartDailyRefreshCompletedEvent") 
       from entry-point "mart" 
     not (MessageHandleStartedEvent(
       this after[0ms, @{timeout}s] $martDailyRefreshRequestedEvent, 
       correlationId == $correlationId, 
       messageTypeName == "MartDailyRefreshCompletedEvent") 
         from entry-point "bpm") 
    then 
     notifier.notify("BPM not responding to MartDailyRefreshCompletedEvent quick enough", 
      String.format(
       "At **%s** Mart sent out a **MartDailyRefreshCompletedEvent**.\n\n**BPM** was supposed to react to it within **@{timeout} seconds**.", 
       $when)); 
end 
end template 

Ensuite, il vous suffit de fournir 30 comme paramètre de modèle:

ObjectDataCompiler converter = new ObjectDataCompiler(); 
InputStream templateStream = getClass().getResourceAsStream(resource.getFilePath()); 
Collection<Map<String, String>> paramMaps = new ArrayList<>(); 
Map<String,String> param = new HashMap<>(); 
param.put("timeout", "30"); 
paramMaps.add(param); 
String drl = converter.compile(paramMaps, templateStream); 
Reader rdr = new StringReader(drl); 
kbuilder.add(ResourceFactory.newReaderResource(rdr), ResourceType.DRL); 
Questions connexes