我需要在固定的时间间隔安排一个任务。在长时间间隔(例如每8小时一次)的支持下,我如何做到这一点?

我目前使用java.util.Timer.scheduleAtFixedRate。java.util.Timer.scheduleAtFixedRate支持长时间间隔吗?


当前回答

我使用Spring Framework的特性。(spring-context jar或maven依赖)。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


@Component
public class ScheduledTaskRunner {

    @Autowired
    @Qualifier("TempFilesCleanerExecution")
    private ScheduledTask tempDataCleanerExecution;

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */)
    public void performCleanTempData() {
        tempDataCleanerExecution.execute();
    }

}

ScheduledTask是我自己与自定义方法execute的接口,我将其作为我的计划任务调用。

其他回答

使用谷歌Guava AbstractScheduledService如下所示:

public class ScheduledExecutor extends AbstractScheduledService {

   @Override
   protected void runOneIteration() throws Exception {
      System.out.println("Executing....");
   }

   @Override
   protected Scheduler scheduler() {
        return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
   }

   @Override
   protected void startUp() {
       System.out.println("StartUp Activity....");
   }


   @Override
   protected void shutDown() {
       System.out.println("Shutdown Activity...");
   }

   public static void main(String[] args) throws InterruptedException {
       ScheduledExecutor se = new ScheduledExecutor();
       se.startAsync();
       Thread.sleep(15000);
       se.stopAsync();
   }
}

如果你有更多这样的服务,那么在ServiceManager中注册所有的服务会很好,因为所有的服务都可以同时启动和停止。阅读这里了解更多关于ServiceManager的信息。

每一秒都做点什么

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        //code
    }
}, 0, 1000);

我使用Spring Framework的特性。(spring-context jar或maven依赖)。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


@Component
public class ScheduledTaskRunner {

    @Autowired
    @Qualifier("TempFilesCleanerExecution")
    private ScheduledTask tempDataCleanerExecution;

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */)
    public void performCleanTempData() {
        tempDataCleanerExecution.execute();
    }

}

ScheduledTask是我自己与自定义方法execute的接口,我将其作为我的计划任务调用。

你应该看看Quartz,它是一个java框架,适用于EE和SE版本,并允许定义作业来执行特定的时间

如果您的应用程序已经在使用Spring框架,那么您已经内置了调度