定时器又叫定时任务、计划任务,在项目开发中使用比较普遍,它能够定时执行规定的任务,例如:订单到期处理、会员到期处理、数据报表生成等
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执行任务时,就已经是多线程任务啦。