SpringBoot实现定时任务的三种方式
一,可以有3种方式配置定时任务
Timer TimerTask
Quartz Scheduler
Task Execution and Scheduling
二, Quartz Scheduler( 配置较为复杂)
1. 引用依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.启动类上添加 @EnableScheduling注解,开启定时任务
3.定义Job
1)
@Component public class MyFirstJob { public void hello(){ System.out.println("MyFirstJob:hello:"+new Date()); } }
2)
public class MySecondJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("hello:"+name+":"+new Date()); } }
4,配置jobdetail,trigger,scheduleFactory
@Configuration
public class QuartzConfig {
/**
* 使用 MethodInvokingJobDetailFactoryBean
* 可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参
*/
1)第一种jobDetail方式
@Bean
MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("hello");
return bean;
}
2)第二种jobDetail方式
/**
* 使用JobDetailFactoryBean 可以配置 JobDetail ,任务类继承自 QuartzJobBean,
* 这种方式支持传参,将参数封装在 JobDataMap 中进行传递,
* job中只需要提供属性名和相应的set方法即可
*/
@Bean
JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean bean = new JobDetailFactoryBean();
JobDataMap map = new JobDataMap();
map.put("name","ljx");
bean.setJobDataMap(map);
bean.setJobClass(MySecondJob.class);
return bean;
}
3)第一种simple trigger
/**
* SimpleTrigger 类似于前面说的 @Scheduled 的基本用法
* 首先设置JobDetail, setStartTime设置开始时间,
* setRepeatInterval任务的时间间隔,setRepeatCount任务的循环次数
*/
@Bean
SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
bean.setStartTime(new Date());
bean.setRepeatInterval(2000);
bean.setRepeatCount(3);
return bean;
}
4) 第二种 CronTrigger
/**
* CronTrigger 类似于 @Scheduled 中 cron 表达式的用法
* 主要配置JobDetail和Cron表达式
*/
@Bean
CronTriggerFactoryBean cronTriggerFactoryBean(){
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setJobDetail(jobDetailFactoryBean().getObject());
bean.setCronExpression("* * * * * ?");
return bean;
}
5) 将trigger配置到 Schedulerfactory
/**
* 创建schedulerFactory,配置相应的Trigger
*/
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setTriggers(simpleTriggerFactoryBean().getObject()
,cronTriggerFactoryBean().getObject());
return bean;
}
}
三,Task Execution and Scheduling
spring 内置的,可以看做是轻量级的quartz
1. 启动类上添加 @EnableScheduling注解,开启定时任务
2. 建立job
3.配置多线程运行
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//参数传入一个size为10的线程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
SchedulingConfigurer默认会单线程运行,当任务多时,需要配置多线程运行
四,Timer TimerTask
Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。
1. 建job
class Task extends TimerTask {
@Override
public void run() {
}
}
2.执行
1)timer = new Timer(true); timer.schedule(new Task(), 30000);
延时多少毫秒后执行此task。
2)schedule(TimerTask task, long delay, long period) 每隔**毫秒运行一次
五,总结
目前在spring boot中,我们只需要用内置的Task Execution and Scheduling即可。