代码之家  ›  专栏  ›  技术社区  ›  Enno Shioji

使用不同间隔的计时器执行定期任务

  •  0
  • Enno Shioji  · 技术社区  · 14 年前

    请注意,超时不会100%准确地发生;i、 下面代码中的超时(javax.ejb.Timer-Timer)可能以100、98、105ms等间隔调用。

    你还有比这更好的主意吗?

    import javax.annotation.Resource;
    import javax.ejb.Timeout;
    import javax.ejb.Timer;
    import javax.ejb.TimerService;
    
    public class TimerBean {
        private static final long TASK_INTERVAL = 1530;
        private static final long TIMEOUT = 100;
    
        @Resource
        private TimerService timerService;
    
    
        public void startTimer() {
            timerService.createTimer(100, TIMEOUT, null);
        }
    
        @Timeout
        public void timeout(javax.ejb.Timer timer) {
            if(isApproxTime(timer, TASK_INTERVAL)){
                //do stuff
            }
        }
    
        private boolean isApproxTime(Timer timer, long targetInterval) {
            long modulus = timer.getNextTimeout().getTime() % targetInterval;
            return modulus < TIMEOUT;
        }
    }
    

    编辑:我想避免使用ejb.Timer以外的状态,所以节省最后一次调用的时间不是一个选项。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Kevin Day    14 年前

    这些要求确实很奇怪。但这到底是怎么回事。

    你可以随时创建计时器吗?如果是这样,请将任务间隔调整为目标间隔过去之前的剩余时间量,或更小的时间量。这会发生漂移,但事件之间的持续时间将大致等于您的目标。

        2
  •  0
  •   mohdajami    14 年前

    Quartz 应该给你更准确和更可控的计时器