Ciao, 여러 가지 방법으로 테스트했지만 Drools Fusion의 이벤트 만료 메커니즘을 테스트하고 확인할 수 없으므로 약간의 지침이 필요하십니까?Drools Fusion CEP에서 이벤트 만료 테스트
내가 설명서를 읽어 봤는데,이 기능에 관심이 있어요 : 엔진이 찾을 수 있도록 즉
, 하나의 이벤트가 작업 메모리에 삽입되는 것이 가능하다 때 이벤트는 더 이상 다른 사실과 일치 할 수 없으며 자동으로 그것을 철회하여 관련 자원을 해제합니다.
Eclipse의 Drools IDE 5.4.0.Final을 사용하고 있으며 "New Drools Project"마법사에서 만든 템플릿 코드를 수정하여 이벤트 만료를 테스트하고 확인합니다.
아래 코드를 참조하십시오. 당신은해야
- : 내가 제대로 작동 할 수있는 "라이프 사이클"을 만들기 위해 이해하는 방법은 즉 이벤트 사이에 임시 제약 조건을 정의하십시오. - 내 케이스에 체크인하십시오. 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)
으로 메시지 이벤트에 일초의 만료를 추가 할 경우에도 첫 번째 메시지 이벤트가 삽입 된 것으로 예상되는 결과를 얻었습니까? 이제 만료 되었습니까? 당신의 도움을 주셔서 감사합니다.