2014-01-15 3 views
0

Drools Fusion 5.5에서 의사 시계를 사용하는 cron 타이머를 기반으로하는 규칙 실행을 테스트하려고합니다. 나는 규칙이 오전 1시에서 매일 발사 할 :Drools Fusion의 가짜 시계로 Cron 타이머 테스트?

rule "CALCULATING DATE FOR NEXT DAY" 
timer (cron:00 00 01 * * ?) 
no-loop 
when 
    $summary: FxSummary(sameDayCcyFlag == false) 
then 
    BusinessDayUtil b = new BusinessDayUtil(); 
    modify($summary) { 
     setSettlementDate(b); 
    } 
end 

나는 다음을 수행 내 테스트 케이스에 다음은 :

PseudoClockScheduler timeService = (PseudoClockScheduler) ksession.getSessionClock(); 
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
Date date = df.parse("2014-01-16T01:00:00.000-0000"); 

Summary sum = new Summary("YEN").setSameDayCcyFlag(false); 
ksession.fireAllRules(); 
timeService.advanceTime(date.getTime(), TimeUnit.MILLISECONDS); 
ksession.fireAllRules(); 

이 ... 타이머 그 어떤 표시를 아무것도하지하지 않는 것 해고되었거나 뭐든지. 또한 12시 59 분 50 초에 날짜를 삽입하고 시계를 10 초 앞당기 자 시도했습니다. 또한, fireUntilHalt 엔진을 실행하는 등 아무것도 작동하는 것 같습니다. 올바르게 사용하고 있습니까? 의사 시계는 타이머와 함께 작동합니까? 또한 발사 예정이었던 타이머를 지나서 시계를 진행하면 "놓친"타이머가 작동합니까?

답변

3

cron을 구현하는 방법에 대해 생각하십시오. 기본적인 기능은 타이머입니다.이 기능은 예전 부엌의 달걀 타이머처럼 작동합니다. 한번에 한 번에 열면 4 ~ 5 분 후에 울릴 것입니다. 따라서 종의 다음 cron 링에 대해 Cook은 시계를보고 지정된 시점까지의 간격을 계산해야합니다.

자정 무렵, 다음 번 오전 1 시까 지 시계를보아야합니다. 이 코드는 의사 시계 사전에 미리() 날짜와 긴 오버로드와 같은 것을 간다 :

date = df.parse("2014-01-15T00:00:00.000-0000"); // Note: midnight 
    advance(date); 
    kSession.fireAllRules(); // (Ah, ring in one hour!) 

    advance(1000*60*60); 
    kSession.fireAllRules(); // Ring! 

    advance(24*1000*60*60); 
    kSession.fireAllRules(); // Ring! 

우체부는 두 번 반지를 ;-)

+0

이 정확히 내 문제라고 생각하지 마십시오 , 그러나 그것은 바른 길에서 나를 붙 잡았다! 나에게 초기 진보 (날짜)는 실제로 아무 것도하지 않는 것처럼 보인다 ... 나는 기본적으로 아무 것도 전달할 수없고 앞으로 나아지지 않는다. 그러나, 두 번째 진행() 후, 그것은 "말하자면"들어가서 제대로 작동합니다. 고맙습니다! – i850eggs

+0

@ i850eggs 시계는 선불 통화로 인해 진행되지만 다른 사람이보아야합니다. - 내가 게시 한 코드 시퀀스는 테스트되고 주석에 설명 된대로 작동합니다. – laune

관련 문제