java开发当中的定时器任务调度

项目当中有时需要在一些业务场景中执行定时操作来完成一些周期性的任务,比如定时从别的资源系统当中抓取和更新系统的数据、定时删除数据库中的历史数据、定时进行数据备份等。

定时器任务常用的解决方案:

第一种:使用Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。 最早的时候就是这样写定时任务的。 

但是Timer和TimerTask存在一些缺陷:

Timer只创建了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题。

Timer创建的线程没有处理异常,因此一旦抛出非受检异常,该线程会立即终止。

第二种:使用 开源的第三方框架: Quartz 或者 elastic-job , 但是这个比较复杂和重量级,适用于分布式场景下的定时任务,可以根据需要多实例部署定时任务。 
第三种:使用Spring提供的注解: @Schedule 。 如果定时任务执行时间较短,并且比较单一,可以使用这个注解。
但是在修改服务器时间时会导致定时任务不执行情况的发生,解决的办法是当修改服务器时间后,将服务进行重启就可以避免此现象的发生。

如每天晚上10点到第二天7点,每15分钟执行一次

@Scheduled(cron = "0 0/15 0,1,2,3,4,5,6,22,23 * * ?")

第四种:使用ScheduledThreadPoolExecutor,它任务的调度是基于相对时间的

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 参数:1、任务体 2、首次执行的延时时间
        //      3、任务执行间隔 4、间隔时间单位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}

你可能感兴趣的:(开发笔记,java框架学习)