在日常项目运行中,我们总会有需求在某一时间段周期性的执行某个动作。比如每天在某个时间段导出报表,或者每隔多久统计一次现在在线的用户量。在springboot中可以有很多方案去帮我们完成定时器的工作,有Java自带的java.util.Timer类,也有强大的调度器Quartz,还有SpringBoot自带的Scheduled,今天主要说说Scheduled。

定时器比较

框架名称 Cron表达式 固定间隔执行 固定频率执行 任务持久化 难易度
TimerTask 不支持 支持 支持 不支持 一般
schedule 支持 支持 支持 不支持 简单
Quartz 支持 支持 支持 支持

在实际应用中,如果没有分布式场景(quartz 支持分布式, schedule 不支持(需要自己实现,用分布式锁),schedule跟spring结合的更好,还是很适用的。

创建schedule工程

使用IntelliJ IDEA创建helloschedule

SpringBoot定时任务Schedule (七)

SpringBoot定时任务Schedule (七)

SpringBoot定时任务Schedule (七)

SpringBoot定时任务Schedule (七)

SpringBoot定时任务Schedule (七)

点击finish完成项目的创建。

SpringBoot定时任务Schedule (七)

为了方便演示,使用@Slf4j输出日志,添加lombok引用,@Slf4j不清楚的可以看看SpringBoot(八)配置logback日志

添加export类。

package com.task.log;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by toutou on 2018/10/20.
 */
@Component
@Slf4j
public class export {
    @Scheduled(cron = "0 0/1 * * * ?")
    public void minuteExport(){
        log.debug("每分钟执行一次的任务:" + getDate());
    }

    @Scheduled(fixedRate = 5000)
    public void fiveSecondExport(){
        log.debug("每5秒执行一次:" + getDate());
    }

    @Scheduled(cron = "0/2 * * * * ?")
    public void twoSecondExport(){
        log.debug("每2秒执行一次:" + getDate());
    }

    @Scheduled(cron = "0 55 14 ? * *")
    public void regularTimeExport(){
        log.debug("每天上午14点55分执行:" + getDate());
    }

    private String getDate(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date());
    }
}

启动类中添加@EnableScheduling注解,然后运行。

SpringBoot定时任务Schedule (七)

查看IntelliJ IDEA控制台日志和物理文件日志

SpringBoot定时任务Schedule (七)

SpringBoot定时任务Schedule (七)

如上图,简单的定时任务输出日志搭建完成。

相关文章: