跳到主要内容

第十六篇:定时任务详解

SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程

在我们日常开发中,经常会遇到 数据定时增量同步定时发送邮件爬虫定时抓取 的需求;这时我们可以采用定时任务的方式去进行工作…..

定时任务概述

定时任务:顾名思义就是在指定/特定的时间进行工作,比如我们的手机闹钟,它就是一种定时任务。

> 实现方式

Timer: JDK自带的java.util.Timer;通过调度java.util.TimerTask的方式 让程序按照某一个频度执行,但不能在指定时间运行。 一般用的较少。

ScheduledExecutorService: JDK1.5新增的,位于java.util.concurrent包中;是基于线程池设计的定时任务类,每个调度任务都会被分配到线程池中,并发执行,互不影响。

Spring Task: Spring3.0 以后新增了task,一个轻量级的Quartz,功能够用,用法简单。

Quartz: 功能最为强大的调度器,可以让程序在指定时间执行,也可以按照某一个频度执行,它还可以动态开关,但是配置起来比较复杂。现如今开源社区中已经很多基于Quartz 实现的分布式定时任务项目xxl-jobelastic-job)。

Timer 方式

基于Timer 实现的定时调度,基本就是手撸代码,目前应用较少,不是很推荐

package com.battcn.timer;
import java.time.LocalDateTime;
import java.util.Timer;
import java.util.TimerTask;
/**
* 基于Timer实现的定时调度(不推荐,用该方式不如用 ScheduledExecutorService )
*
* @author Levin
* @since 2018/5/29 0029
*/
public class TimerDemo {
public static void main(String[] args) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("执行任务:" + LocalDateTime.now());
}
};
Timer timer = new Timer();
// timerTask:需要执行的任务
// delay:延迟时间(以毫秒为单位)
// period:间隔时间(以毫秒为单位)
timer.schedule(timerTask, 5000, 3000);
}
}