Springboot項目中使用quartz定時任務

由於項目需求,需要在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的操作,這就有很多了,這裏就不做具體記錄了。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章