0

我正在尝试使用 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 让引擎运行等。似乎没有任何效果。我正确使用它吗?伪时钟可以与计时器一起使用吗?此外,如果我将时钟提前超过应该触发的计时器,它会触发“错过”的计时器吗?

4

1 回答 1

3

想想如何实现 cron。基本功能是定时器,它的工作原理就像老厨房的煮蛋器:在某个时间点上弦,然后它会在 4 或 5 分钟后响起。因此,对于下一个 cron 铃声,厨师将不得不查看时钟并计算到指定时间点的间隔。

您必须让厨师在下一个凌晨 1:00 之前的某个时间查看时钟,例如午夜左右。代码是这样的,advance() 重载了 Date 并且 long 来推进伪时钟:

    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!

邮递员只响了两次;-)

于 2014-01-16T05:29:09.427 回答