2014-01-06 2 views
1

Я пытаюсь запустить следующие правила в Drool Fusion (версия 5.4.1), но он не работает.Timer in Drools Fusion не работает

В идеале, он должен печатать «HELLO WORLD» каждые 7 секунд, это даже не запускается один раз.

Может кто-нибудь, пожалуйста, помогите мне понять таймер в Drools?

 import com.drools.message.Message 

rule "Test" 
    timer(int: 7s 7s) 
when 
    message:Message (type=="Hello") 
then 
    System.out.println("Hello World, Drools! " + message.getMsgtext()); 
end 
My code to run the above Rule is: 
public class TestDrools { 

    private static String DRL_FILE = "test_drools.drl"; 
    private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory 
      .newKnowledgeBuilder(); 
    private static Collection pkgs; 
    private static KnowledgeBase kbase = KnowledgeBaseFactory 
      .newKnowledgeBase(); 
    private static StatefulKnowledgeSession ksession; 

    private static WorkingMemoryEntryPoint entryPoint; 

    public static void main(String[] args) { 
     init(); 
     while (true) { 
      Message msg = new Message(); 
      msg.setType("Hello"); 
      msg.setMsgtext("1"); 
      ksession.insert(msg); 
     } 
    } 

    private static void init() { 
     initialiseDrools(); 
    } 

    private static void initialiseDrools() { 
     kbuilder.add(ResourceFactory.newClassPathResource(DRL_FILE), 
       ResourceType.DRL); 
     if (kbuilder.hasErrors()) { 
      System.out.println(kbuilder.getErrors().toString()); 
      throw new RuntimeException("Unable to compile drl\"."); 
     } 
     pkgs = kbuilder.getKnowledgePackages(); 
     KnowledgeBaseConfiguration config = KnowledgeBaseFactory 
       .newKnowledgeBaseConfiguration(); 
     config.setOption(EventProcessingOption.STREAM); 
     kbase = KnowledgeBaseFactory.newKnowledgeBase(config); 
     kbase.addKnowledgePackages(pkgs); 
     KnowledgeSessionConfiguration conf = KnowledgeBaseFactory 
       .newKnowledgeSessionConfiguration(); 
     conf.setOption(ClockTypeOption.get("pseudo")); 
     ksession = kbase.newStatefulKnowledgeSession(conf, null); 
     entryPoint = ksession.getWorkingMemoryEntryPoint("entryone"); 
     new Thread() { 
      @Override 
      public void run() { 
       ksession.fireUntilHalt(); 
      } 
     }.start(); 
    } 
} 

Спасибо -Sanjay

+0

Я уверен, что вы используете fireUntilHalt()? Возможно, вам стоит указать ваш код API. – Steve

+0

новый Thread() { \t \t \t @Override \t \t \t общественности недействительным запуска() { \t \t \t \t ksession.fireUntilHalt(); \t \t \t} \t \t} .start(); \t} – user3164370

+1

Вы не используете псевдо-часы случайно? – laune

ответ

0

then состояние происходит, когда when состояние соответствует, так что вам нужно, по крайней мере, поставить eval(true) в when condition и активировать вставку в knowledgeSession, чтобы механизм правил определял, что делать, когда выполняется какое-то условие.

+0

Спасибо за ответ. Я попытался использовать «когда eval (true)», но это та же проблема. Если мое понимание правильное, по умолчанию с пустым блоком «когда» означает eval (true), исправьте меня, если я ошибаюсь. – user3164370

+0

Да, пустое означает eval (true), но вы делаете что-то, что вставляет факт и запускает правило выполнения правил? –

+1

Да, я вставляю пользовательские сообщения как факт в сеанс, который должен вызвать правило. Еще одна вещь, если я удаляю таймер, он отлично работает, не уверен, что происходит с таймером. – user3164370

1

Согласно комментарию @ laune, вы использовали pseudo clock. Если вы хотите использовать realtime часы, измените следующую строку:

conf.setOption(ClockTypeOption.get("realtime")); 

Или просто удалить строку в целом - realtime это часы по умолчанию.

Если вы хотите использовать псевдо-часы, вам нужно будет продвигать его самостоятельно. Обычно это используется при модульном тестировании, например.

SessionPseudoClock clock = ksession.getSessionClock(); 
    // insert some facts ... 
    clock.advanceTime(1, TimeUnit.HOURS); 
    ksession().fireAllRules(); 

    // Do your unit test asserts/verify mocks here to verify that 
    // time-reasoned rules were/weren't fired 
+1

Обратите внимание, что в общем случае можно использовать альтернативные вставки и andvances, выполненные в отдельном потоке, параллельно с ним. - Или последовательность, отправленная Стюартом: заранее/[вставка/продвижение/огонь могут выполняться повторно. – laune

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

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