2013-09-30 2 views
1

Я пытаюсь написать правило для события, которое должно проверить, что-то происходит в течение некоторого временного окна после чего-то еще. На данный момент код выглядит следующим образом (он работает правильно):Как написать динамические временные правила в 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 

На данный момент 30s эффективно жестко. Я читал, что если вы хотите параметризовать правила, вам нужно использовать другие факты, заявленные в КБ, но я не могу понять, как это сделать для временных правил.

Итак: как я могу «настроить» 30s в этих правилах, чтобы изменить значение вне приложения? Что-то вроде этого: MessageHandleStartedEvent(this after [ $duration ] ...

ответ

0

Вы можете использовать шаблоны, чтобы обеспечить жестко закодированные 30 извне Drools.

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 

Тогда вам просто необходимо предоставить 30 в качестве параметра шаблона:

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); 

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

  • Нет связанных вопросов^_^