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执行任务时,就已经是多线程任务啦。