首先咱先来了解一下JDK和Spring线程池对于解决定时任务的问题
在分布式服务器的情况下,每台服务器代码一致,当有controller请求时,会只有一台服务器进行处理,但是在定时任务的情况下,每台服务器都会进行定时任务,程序运行的参数存在内存当中,每台服务器的信息不能共享,不知道其他服务器正在干什么,所以说此时系统就会出现问题。
所以才采取Quartz进行解决定时任务的问题
使用Quartz的时候,程序运行的参数会存在数据库当中,因为数据只有一个,当一台服务器进行访问数据当中的任务参数时,如果任务显示是正在等待中,该服务器会进行任务处理,也会随之将任务状态修改为正在处理当中,当其他服务器访问数据库时,数据库中会显示任务正在运行,此时其他服务器就不会进行此任务处理
通过共享数据来处理定时任务
Spring整合Quartz1、添加依赖
org.springframework.boot spring-boot-starter-quartz
2、由于Quartz是依据数据库中的数据,所以要在数据库当中添加Quartz官方定义的表
3、Quartz 几个核心接口
Scheduler--所有由quartz调度的任务都是通过此接口去调的
Job--通过此接口定义任务(在此接口中写上要执行的任务)
JobDetail-用来配置Job中的任务
Trigger--配置Job中任务是什么时候执行,以什么频率进行执行
配置好之后,当程序启动的时候Quartz就会读取配置信息,并且将它读取到的信息立刻存到数据库中,自动存到那些表中,以后就会去读取那些表去执行任务
4、配置Quatz
#QuartzProperties spring.quartz.job-store-type=jdbc//用JDBC存储 spring.quartz.scheduler-name=communityScheduler//调度器的名字 spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO//调度器的ID自动生成 spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX//任务存储到数据库时用的是哪个类 spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate//存储时用的是哪个驱动 spring.quartz.properties.org.quartz.jobStore.isClustered=true//存储的时候是否用集群方式 spring.quartz.properties.org.quartz.threadPool.class=org.quartz.impl.SimpleThreadPool//用的是哪个线程池,此线程池是底层的 spring.quartz.properties.org.quartz.threadPool.threadCount=5//线程的数量
5、编写一个Job实现Job接口
package com.nowcoder.community.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class AlphaJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(Thread.currentThread().getName()+": execute a quartz job.");
}
}
6、编写Quatz配置类
package com.nowcoder.community.config;
import com.nowcoder.community.quartz.AlphaJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
//配置->数据库->调用
@Configuration
public class QuartzConfig {
//配置JobDetail
@Bean
public JobDetailFactoryBean alphaJobDetail(){
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass(AlphaJob.class);//声明要管理的Bean,类型是什么
factoryBean.setName("alphaJob");//给任务起个名字
factoryBean.setGroup("alphaJobGroup");//给任务加一个组
factoryBean.setDurability(true);//声明任务是否长久保存
factoryBean.setRequestsRecovery(true);//声明任务是否可恢复
return factoryBean;
}
//配置Trigger(SimpleTriggerFactoryBean,CronTriggerFactory)
@Bean
public SimpleTriggerFactoryBean alphaTrigger(JobDetail alphaJobDetail ){
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(alphaJobDetail);//设置这个Trigger为你写Job设置的触发器
factoryBean.setName("alphaTrigger");//设置Trigger名字
factoryBean.setGroup("alphaTriggerGroup");//设置Trigger所属的组
factoryBean.setRepeatInterval(3000);//设置Job执行的频率
factoryBean.setJobDataMap(new JobDataMap());//Trigger底层要存储Job的状态,可以用JobDataMap对象来存储,也可以自己写一个对象存储
return factoryBean;
}
}



