首先maven需要导入两个jar包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
@Configuration
public class QuartzConfig {
//引入数据源
@Autowired
@Qualifier(value = "dataSource")
private DataSource dataSource;
//重写自定义job工厂
@Autowired
private SpringJobFactory springJobFactory;
//此处代替的为《quartz.properties》配置文件
//此处只写我用到的这个配置,其他的配置可在网上自行百度 标记一些特殊的配置
private Properties createProperties(){
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName","Quartz");
prop.put("org.quartz.scheduler.instanceId","AUTO");
prop.put("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount","10");
prop.put("org.quartz.threadPool.threadPriority","5");
prop.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread","true");
prop.put("org.quartz.jobStore.class","org.quartz.impl.jdbcjobstore.JobStoreTX");
prop.put("org.quartz.jobStore.useProperties","true");
//是否加入集群模式
prop.put("org.quartz.jobStore.isClustered","true");
prop.put("org.quartz.jobStore.clusterCheckinInterval","20000");
//在存储在数据库中时,数据库表的前缀 不同数据库需要单独注意建表语句和此处前缀的大小写
prop.put("org.quartz.jobStore.tablePrefix","QRTZ_");
prop.put("org.quartz.jobStore.driverDelegateClass","org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
prop.put("org.quartz.jobStore.misfireThreshold","60000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime","1");
prop.put("org.quartz.plugin.triggHistory.class","org.quartz.plugins.history.LoggingJobHistoryPlugin");
prop.put("org.quartz.plugin.shutdownhook.class","org.quartz.plugins.management.ShutdownHookPlugin");
prop.put("org.quartz.plugin.shutdownhook.cleanShutdown","true");
prop.put("org.quartz.jobStore.acquireTriggersWithinLock","true");
return prop;
}
//配置SchedulerFactoryBean
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(springJobFactory);
schedulerFactoryBean.setDataSource(dataSource);
//此处设置的为在你更新完定时事件后会不会在系统重启后修改定时时间,true会将数据库的表中的数据清空再重建 false会判断定时任务是否存在,存在的话读取数据库中的任务时间否则进行数据插入
schedulerFactoryBean.setOverwriteExistingJobs(false);
schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContextKey");
schedulerFactoryBean.setQuartzProperties(createProperties());
//多Trigger时的写法
//schedulerFactoryBean.setTriggers(exportExcelTrigger().getObject(),refreshLockedUsersTrigger().getObject());
//单trigger的写法,需注意此处的Trigger的获取必须再次数获取Trigger 若直接返回的话会报空指针 导致的原因为 Bean的创建在getObject之前
//多Trigger时需要多次编写flushJobDetailFactoryBean及refreshLockedUsersTrigger
schedulerFactoryBean.setTriggers(refreshLockedUsersTrigger().getObject());
return schedulerFactoryBean;
}
@Bean
public Scheduler scheduler(){
return schedulerFactoryBean().getScheduler();
}
@Bean
public JobDetailFactoryBean flushJobDetailFactoryBean(){
JobDetailFactoryBean jobDetail = new JobDetailFactoryBean();
jobDetail.setJobClass(QuartzFlushUser.class);
jobDetail.setDurability(true);
jobDetail.setRequestsRecovery(true);
return jobDetail;
}
@Bean
public CronTriggerFactoryBean refreshLockedUsersTrigger (){
CronTriggerFactoryBe