springboot定时任务和Quartz的整合使用
1 引言
业务上需要定时执行一些逻辑代码
2 使用springboot自带的定时任务
2.1 开启服务
在启动类上添加注解@EnableScheduling
2.2 配置任务线程池
默认线程池为1,此处改为10
spring:
task:
scheduling:
pool:
size: 1
2.3 编写任务
@Component
public class Task1 {
@Scheduled(cron = "* * * * * ?")
public void task1() throws InterruptedException {
Thread.sleep(1000*5);
System.out.println("task1:"+Thread.currentThread());
}
@Scheduled(cron = "* * * * * ?")
public void task2(){
System.out.println("task2:"+Thread.currentThread());
}
}
3 使用Quartz定时任务
为什么要使用quartz,支持cluster,支持持久化到数据库,不怕服务宕机,等等有很多优点,但是使用起来比较复杂
3.1 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3.2 开启服务
在启动类上添加注解@EnableScheduling
3.3 任务类
3.3.1 任务类1
public class QuartzTask1 extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
System.out.println("QuartzTask1现在的时间:"+time+"--->"+Thread.currentThread());
}
}
3.3.2 任务类2
public class QuartzTask2 extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
System.out.println("QuartzTask2现在的时间:"+time+"--->"+Thread.currentThread());
}
}
3.4 配置类
注意:有多个任务时 需要多个配置类与之对应
3.4.1 配置类1
@Configuration
public class QuartzConfig {
//构建 JobDetail 有多个任务时不能重名
@Bean
public JobDetail MyJobDetail1() {
//自己编写的具体的任务类
return JobBuilder.newJob(QuartzTask1.class)
//给JobDetail起一个id, 不写默认自动自动生成唯一的TriggerKey
.withIdentity("myTaskId")
/**
* JobDetail内部的一个map,可以存储有关Job的数据,这里的数据
* 可通过Job类中executeInternal方法的参数进行获取
*/
.usingJobData("name","dog")
//即使没有Trigger关联时也不删除该Jobdetail
.storeDurably()
.build();
}
//构建 Trigger 及 Scheduler
@Bean
public Trigger downloadTrigger() {
return TriggerBuilder.newTrigger()
.forJob(MyJobDetail1()) //关联上面的 jobDetail
.withIdentity("myTaskId")
.usingJobData("trigger_download","download")
//cron 表达式设置每隔 5 秒执行一次
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *"))
.build();
}
}
3.4.2 配置类2
@Configuration
public class QuartzConfig2 {
//构建 JobDetail
@Bean
public JobDetail MyJobDetail2() {
//自己编写的具体的任务类
return JobBuilder.newJob(QuartzTask2.class)
//即使没有Trigger关联时也不删除该Jobdetail
.storeDurably()
.build();
}
//构建 Trigger 及 Scheduler
@Bean
public Trigger downloadTrigger2() {
return TriggerBuilder.newTrigger()
.forJob(MyJobDetail2())
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *"))
.build();
}
}
