2012-09-09 5 views
2

Ciao, 여러 가지 방법으로 테스트했지만 Drools Fusion의 이벤트 만료 메커니즘을 테스트하고 확인할 수 없으므로 약간의 지침이 필요하십니까?Drools Fusion CEP에서 이벤트 만료 테스트

내가 설명서를 읽어 봤는데,이 기능에 관심이 있어요 : 엔진이 찾을 수 있도록 즉

, 하나의 이벤트가 작업 메모리에 삽입되는 것이 가능하다 때 이벤트는 더 이상 다른 사실과 일치 할 수 없으며 자동으로 그것을 철회하여 관련 자원을 해제합니다.

Eclipse의 Drools IDE 5.4.0.Final을 사용하고 있으며 "New Drools Project"마법사에서 만든 템플릿 코드를 수정하여 이벤트 만료를 테스트하고 확인합니다.

아래 코드를 참조하십시오. 당신은해야

  • 을 확인 -
  • 당신은 시간적 순서로 이벤트를 삽입해야합니다 확인 -

    당신은 설정 STREAM 모드에서 KBase해야
    • : 내가 제대로 작동 할 수있는 "라이프 사이클"을 만들기 위해 이해하는 방법은 즉 이벤트 사이에 임시 제약 조건을 정의하십시오. - 내 케이스에 체크인하십시오. Message()

    그러나 EventFactHandle을 마지막으로 검사 할 때 Event()가 만료되지 않습니다. 도움 주셔서 감사합니다.

    자바 :

    public class DroolsTest { 
    
        public static final void main(String[] args) { 
         try { 
          KnowledgeBase kbase = readKnowledgeBase(); 
          // I do want the pseudo clock 
          KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); 
          conf.setOption(ClockTypeOption.get("pseudo")); 
          StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(conf, null); 
          SessionPseudoClock clock = ksession.getSessionClock(); 
          KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); 
          // Insert of 2 Event: 
          Message message = new Message(); 
          message.setMessage("Message 1"); 
          message.setStatus(Message.HELLO); 
          ksession.insert(message); 
          ksession.fireAllRules(); 
          clock.advanceTime(1, TimeUnit.DAYS); 
          Message message2 = new Message(); 
          message2.setMessage("Message 2"); 
          message2.setStatus(Message.HELLO); 
          ksession.insert(message2); 
          ksession.fireAllRules(); 
          clock.advanceTime(1, TimeUnit.DAYS); 
          ksession.fireAllRules(); 
          // Now I do check what I have in the working memory and if EventFactHandle if it's expired or not: 
          for (FactHandle f : ksession.getFactHandles()) { 
           if (f instanceof EventFactHandle) { 
            System.out.println(((EventFactHandle)f)+" "+((EventFactHandle)f).isExpired()); 
           } else { 
            System.out.println("not an Event: "+f); 
           } 
          } 
          logger.close(); 
         } 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."); 
         } 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
         // following 2 lines is the template code modified for STREAM configuration 
         KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); 
         config.setOption(EventProcessingOption.STREAM); 
         return kbase; 
        } 
    
        /* 
        * This is OK from template, as from the doc: 
        * By default, the timestamp for a given event is read from the Session Clock and assigned to the event at the time the event is inserted into the working memory. 
        */ 
        public static class Message { 
    
         public static final int HELLO = 0; 
         public static final int GOODBYE = 1; 
    
         private String message; 
    
         private int status; 
    
         public String getMessage() { 
          return this.message; 
         } 
    
         public void setMessage(String message) { 
          this.message = message; 
         } 
    
         public int getStatus() { 
          return this.status; 
         } 
    
         public void setStatus(int status) { 
          this.status = status; 
         } 
    
        } 
    
    } 
    

    Drools가 :

    package com.sample 
    
    import com.sample.DroolsTest.Message; 
    
    declare Message 
    @role(event) 
    end 
    
    declare window LastMessageWindow 
        Message() over window:length(1) 
    end 
    
    rule "Hello World" 
        when 
         accumulate($m : Message(status==Message.HELLO) from window LastMessageWindow, 
           $messages : collectList($m)) 
        then 
         System.out.println(((Message)$messages.get(0)).getMessage()); 
    end 
    

    는 참고 : 나는 아직도 할

    @expires(1s) 
    

    으로 메시지 이벤트에 일초의 만료를 추가 할 경우에도 첫 번째 메시지 이벤트가 삽입 된 것으로 예상되는 결과를 얻었습니까? 이제 만료 되었습니까? 당신의 도움을 주셔서 감사합니다.

  • 답변

    3

    발견 된 솔루션! 분명히 내가 어리 석고 내가 Drools 5.4.0을 사용하고 있다는 사실을 깨닫지 못했습니다. 마지막으로 5.2.0의 오래된 문서를 참고하면서 말입니다. 최종. Drools Fusion 5.4.0. 최종에 대한 업데이트 된 설명서에서이 상자는 2.6.2에 추가되었습니다. 슬라이딩 길이 윈도우 :

    길이 기반 윈도우는 세션의 이벤트 만료에 대한 시간 제한을 정의하지 않으므로 엔진은 고려하지 않습니다. 이벤트에 시간 제약 조건과 명시적인 만료 정책을 정의하는 다른 규칙이없는 경우 엔진은 세션에서 무기한으로 유지합니다.

    Message() over window:length(1) 
    

    이 : 지금 Drools가 5.4.0.Final에 길이 창 슬라이딩 이해하기 때문에

    은 그러므로 내가 원래 "당신은 이벤트 사이의 시간 제한 조건을 정의해야합니다"의 입대 번째 요구 사항은 분명히 충족되지 실제로 세션에서 이벤트 만료에 대한 시간 제한 조건의 정의가 아닙니다.

    이 답변을 업데이트하면 누군가 도움이 될 것입니다. 또한, 당신이 알고 있기 때문에, 실제로 닥에 도달하기 위해 인터넷 검색에 의존하는 바보가되고, 때로는 현재 출시 문서로 리다이렉트되지 않기 때문에 ...