由於項目需求,需要在boot項目中集成定時任務quartz,而且要持久化到數據庫中,而且需要自定義關聯執行的條件,這就有一些困難了;一是以前沒有怎麼使用過quartz;二就是還要再這個基礎上適應項目中的需求。
好吧,沒辦法那就一個一個解決吧,還好現在都有開源的項目,那就找吧。找了很多有關於定時任務的項目,有幾個甚至還不錯,運行起來很給力,只是在集成到項目中的時候,問題就來了,可以運行定時任務,只是存不到數據庫,找了很多方法,慢慢的有了一點很淺顯的認知。
quartz定時框架使用的默認數據庫連接池是c3p0,找的項目大多都是單獨寫的定時任務,而我需要集成到項目中去,項目使用的是hikari,所以啓動的項目的時候錯誤不斷,真是傷透了腦筋(太菜。。。),沒辦法,就繼續找解決辦法,翻了很多頁面,也改變了很多用法,最後勉強實現了,真是皇天不負有心人啊!ps:項目應該還可以繼續優化,只是時間和技術限制,只能慢慢優化,也希望有大神來指點一下。。。。
上代碼:SchedulerConfig.java配置類
package com.config.quartz;
import org.quartz.Scheduler;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.io.IOException;
import java.util.Properties;
/**
* quartz配置
*
* @author Administrator
*/
@Configuration
public class SchedulerConfig {
@Autowired
private SpringJobFactory springJobFactory;
@Bean(name="SchedulerFactory")
public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setAutoStartup(true);
//延時5秒啓動
factory.setStartupDelay(5);
factory.setQuartzProperties(quartzProperties());
factory.setJobFactory(springJobFactory);
return factory;
}
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
/*
* quartz初始化監聽器
*/
@Bean
public QuartzInitializerListener executorListener() {
return new QuartzInitializerListener();
}
/*
* 通過SchedulerFactoryBean獲取Scheduler的實例
*/
@Bean(name="Scheduler")
public Scheduler scheduler() throws IOException {
return schedulerFactoryBean().getScheduler();
}
}
SpringJobFactory.java
package com.config.quartz;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
/**
* 解決spring bean注入Job的問題
* @author Administrator
*/
@Component
public class SpringJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 調用父類的方法
Object jobInstance = super.createJobInstance(bundle);
// 進行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
注:由於原來使用的是單獨的quartz的框架,以上是保留的配置信息,後來改的過程中換了boot集成的quartz,應該是集成了某些功能,由於時間原因,這裏沒有深入研究
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
下面是quartz的配置文件:
#=======================================================
#調度器配置
#=======================================================
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName=myMonitorScheduler
org.quartz.scheduler.rmi.export=false
org.quartz.scheduler.rmi.proxy=false
#=======================================================
#線程池配置
#=======================================================
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=5
org.quartz.threadPool.threadPriority=5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
#=======================================================
#JobStore配置
#=======================================================
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.isClustered=false
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.dataSource=myDS
#=======================================================
#數據庫配置,用Springboot項目hikaricp,這裏是改變默認連接池
#=======================================================
org.quartz.dataSource.myDS.provider = hikaricp
org.quartz.dataSource.myDS.driver= com.mysql.cj.jdbc.Driver
org.quartz.dataSource.myDS.URL= jdbc:mysql://127.0.0.1:6603/test?characterEncoding=utf-8&useSSL=false
org.quartz.dataSource.myDS.user= root
org.quartz.dataSource.myDS.password= root
org.quartz.dataSource.myDS.maxConnections=5
ps:大部分時間都在解決這個持久化到數據庫的問題,現在總算知道什麼是具體問題具體分析了,還有待加強學習。
具體對於quartz的操作,這就有很多了,這裏就不做具體記錄了。。。