Spring boot定时任务的两种实现方式

604 阅读1分钟
  • 基于注解实现静态简易定时任务
  • 集成 Quartz 实现动态定时任务

前言

先理一理定时任务
定时任务的本质,有三大步
1. Job:要执行的任务,比如定时传输文件,定时更新某些数据,等等操作。
2. Trigger:Job 的执行规则,比如什么时候执行,执行间隔,执行次数,等等规则。 
3. Scheduler:有了Job,有了Trigger,但 用哪个Trigger执行哪个Job?这时候就轮到Scheduler登场了

一、基于注解实现静态简易定时任务

直接上代码,这个比较简单,主要关注里面的 cron 表达式,详细语法可点击这里

@Configuration
@EnableScheduling
public class StaticScheduleTask {
    @Scheduled(cron = "0/5 * * * * ?") // 每隔5秒执行一次
    public void configurationTask(){
        System.out.println("执行定时任务="+ LocalDateTime.now());
        getData();
    }
​
    public static void getData(){
        Map<String, Object> map = new HashMap<>();
        map.put("001", "zhangsan");
        map.put("002", "lisi");
        System.out.println(map);
    }
​

二、集成 Quartz 实现动态定时任务

上代码

/**
 * @Description Job 定时任务要完成的工作
 */
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        System.out.println("正在执行Job"+LocalDateTime.now());
    }
}
public class MyScheduler {
    public static void main(String[] args) throws SchedulerException {
        // 1、创建调度器Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 2、创建JobDetail实例,并与MyJob类绑定(Job执行内容)
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .usingJobData("jobDetail1", "这个Job用来测试的")
                .withIdentity("job1", "group1").build();
        // 3、构建Trigger实例,每隔1s执行一次
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                .usingJobData("trigger1", "这是jobDetail1的trigger")
                .startNow()//立即生效
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
​
        //4、执行
        scheduler.scheduleJob(jobDetail, cronTrigger);
        System.out.println("--------scheduler start ! ------------");
        scheduler.start();
        System.out.println("--------scheduler shutdown ! ------------");
​
    }