一,可以有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即可。