在Drools Fusion中使用伪时钟进行Cron定时器测试?

时间:2014-01-15 23:35:44

标签: drools drools-fusion

我正在尝试使用Drools Fusion 5.5中的伪时钟测试基于cron计时器的规则的触发。我希望规则每天凌晨1点开火:

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让发动机运转等等。似乎没什么用。我正确使用这个吗?伪时钟是否与定时器一起使用?此外,如果我将时钟推进应该触发的计时器,它是否会触发“错过”的计时器?

1 个答案:

答案 0 :(得分:3)

考虑如何实现cron。基本功能是计时器,这就像你厨房的鸡蛋计时器一样:在一个时间点你把它弄好,然后它会在4或5分钟后响。因此,对于钟的下一个cron环,Cook必须查看时钟并计算到指示时间点的间隔。

你必须让库克在下午1点之前的某个时间看看时钟,比如午夜时分。代码就是这样的,其中advance()重载了Date并且很长时间来推进伪时钟:

    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!

邮递员只响两次; - )