代码之家  ›  专栏  ›  技术社区  ›  GustyWind

根据服务器的频率和启动设置任务的启动

  •  2
  • GustyWind  · 技术社区  · 15 年前

    我有一个执行频率的频率和时间范围。 例如,如果当前时间为凌晨2点,频率为360分钟,则必须假设

    当前时间是从午夜开始的服务器启动时间。 因此,如果服务器在早上5点启动,并且frequency是360,那么任务应该在早上6点运行

    但是如果任务是凌晨5点,频率是240,因为从午夜开始已经过了240分钟 下次跑步应该在早上8点

    如果服务器在上午10点启动,频率为300,则从午夜开始,一次运行在上午5点结束,下一次运行在上午10点计算,因此将在上午10点立即启动

    时间范围分为4个季度,上午12点至上午6点至下午12点,下午12点至下午6点,下午6点至次日12点 下面提供了一些值:

     stNow----serverTime
    sElapsed ---time elapsed from midnight
    currFreq ----frequecy 
        protected int _getInitWorkerTime()
        {
             int vRun=0;
             STime stNow= new STime(PWMSystem.newDate());
             int currFreq = _findAlertFrequency()/60;
             int sElapsed =Constants.MINUTES_PER_DAY-stNow.elapsedMinutes(STime.midnight);
             _log.error("now time as 24------"+stNow.getHourNo24());
             _log.error("now currFreq------"+currFreq);
             _log.error("now sElapsed-----"+sElapsed);
             if(sElapsed == 1440)
                 sElapsed=0;
             if(stNow.getHourNo24()>=0  && stNow.getHourNo24()<=6)
             {
                 _log.error("now time as 24-inside cond-1-----"+stNow.getHourNo24());
                     if(currFreq>sElapsed)
                         vRun= currFreq-sElapsed;
                     else
                         vRun= -(currFreq-sElapsed);
             }
             if(stNow.getHourNo24()>6 && stNow.getHourNo24()<=12)
             {
                 _log.error("now time as 24-inside cond-2-----"+stNow.getHourNo24());
                 if(currFreq>sElapsed)
                      vRun=360-(currFreq-sElapsed);
                  else
                      vRun=360-(-(currFreq-sElapsed));
             }
             if(stNow.getHourNo24()>12 && stNow.getHourNo24()<=18)
             {
                 _log.error("now time as 24-inside cond-3-----"+stNow.getHourNo24());
                 if(currFreq>sElapsed)
                      vRun=720-(currFreq-sElapsed);
                  else
                      vRun=720-(-(currFreq-sElapsed));
             }
             if(stNow.getHourNo24()>18 && (stNow.getHourNo24()<=24 ||stNow.getHourNo24()<=0))
             {
                 _log.error("now time as 24-inside cond-4-----"+stNow.getHourNo24());
                 if(currFreq>sElapsed)
                      vRun=1080-(currFreq-sElapsed);
                  else
                      vRun=1080-(-(currFreq-sElapsed));
             }
                // vRun=_MAX_FREQUENCY_DELAY_IN_SEC+ sElapsed*60+_findAlertFrequency()+_BOOT_DELAY_SECONDS_START;*/
            //vRun=stNow.elapsedMinutes(STime.midnight)*60+_findAlertFrequency()+_BOOT_DELAY_SECONDS_START;
            return (vRun*60 + _BOOT_DELAY_SECONDS_START);       
        }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Jon Skeet    15 年前

    这不就是说:

    int nextTime = ((timeSinceMidnight / (period-1)) + 1) * period;
    

    准时,例如下面的第三个测试用例。)

    示例情况:

    Period      Minutes since midnight        Result
    360         120 (2am)                     360 (6am)
    240         300 (5am)                     480 (8am)
    300         600 (10am)                    600 (10am)    
    

    (请注意,我指的是周期而不是频率-通常较高的频率意味着发生了一些事情 较少的 .)

        2
  •  0
  •   GustyWind    15 年前

    我发现。。

    protected int _getInitWorkerTime()
    {   
            int vRun = 0;
            STime stNow = new STime(PWMSystem.newDate());
            int currFreq = _findAlertFrequency() / Constants.SECONDS_PER_MINUTE;
            int sElapsed = Constants.MINUTES_PER_DAY- stNow.elapsedMinutes(STime.midnight);
            int runsCompleted = sElapsed / currFreq;
            int remainLeft = (runsCompleted + 1) * currFreq;
    
    
                    if (remainLeft > sElapsed)
                        vRun = remainLeft - sElapsed;
                    else
                        vRun = sElapsed - remainLeft;
    
    
    return (vRun * 60 + _BOOT_DELAY_SECONDS_START);