Spring Boot 内置定时器的使用

定时器又叫定时任务、计划任务,在项目开发中使用比较普遍,它能够定时执行规定的任务,例如:订单到期处理、会员到期处理、数据报表生成等

Springboot内置的定时任务  默认是单线程,使用非常方便,使用时要在Application中设置启用定时任务功能@EnableScheduling,代码如下:

1.启用定时任务功能

@SpringBootApplication
@EnableScheduling
@MapperScan("main.blog.mapper")

public class BootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }
}

2.使用@Scheduled注解执行定时任务

使用 @Scheduled来创建定时任务 这个注解用来标注一个定时任务方法。 
通过看 @Scheduled源码可以看出它支持多种参数:
(1).cron:cron表达式,指定任务在特定时间执行;
(2).fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
(3).fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
(4).fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
(5).fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
(6).initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
(7).initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
(8).zone:时区,默认为当前时区,一般没有用到。

单线程定时任务的使用,代码如下:

package com.blog.controller;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;

@Controller("Task")
public class TaskController
{
    private static final Logger logger = LoggerFactory.getLogger(TaskController.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:mm:dd HH:mm:ss");
    
    /**
     * 方法一:cron方式,项目启动后每5秒执行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void cronTask() 
    {
        logger.info("Cron方式-定时任务执行时间:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法二:fixedRate方式,上一次的开始时间与下一次的开始时间为基点,项目启动时会执行一次,然后每5秒执行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask()
    {
        logger.info("fixedRate方式-定时任务执行时间:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法二:fixedRate方式,项目启动时2秒后会执行一次,然后每5秒执行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(initialDelay = 2000,fixedRate = 5000)
    public void fixedRateInitialDelayTask() 
    {
        logger.info("initialDelay方式-定时任务执行时间:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法三:fixedDelay方式,上一次的结束时间与下一次的开始时间为基点,项目启动时会执行一次,然后每5秒执行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask()
    {
        logger.info("fixedDelay方式-定时任务执行时间:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法三:fixedDelay方式,项目启动时2秒后会执行一次,然后每5秒执行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(initialDelay = 2000, fixedDelay = 5000)
    public void initialDelayFixedDelayTask() 
    {
      logger.info("initialDelay方式-定时任务执行时间:"+ dateFormat.format(new Date()));
    }
}

3.多线程定时任务的使用

在config下新增配置文件SchedulerConfig.java ,配置自定义线程池,代码如下:

@Configuration
@EnableScheduling  //开启定时器
public class SchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        //多线程配置
        scheduledTaskRegistrar.setScheduler(taskExecutor());
    }

    @Bean
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }
}
然后再用@Scheduled执行任务时,就已经是多线程任务啦。
原文地址:https://www.cnblogs.com/huxiaoguang/p/10807295.html