1. 程式人生 > >使用註解定時Quartz+資料庫持久+動態job監聽(或許還支援分散式)

使用註解定時Quartz+資料庫持久+動態job監聽(或許還支援分散式)

    springmvc框架已經很成熟了,所以引入的jar包我就不詳細說了,百度有很多我先簡單描述我說的主要功能:

由spring的Quartz在啟動之後,掃描資料庫的任務,使用場景,需要動態新增定時任務如:定時啟動某智慧家居裝置,定時抽獎等,

這裡順便附上一份第一種quartz的xml方式:  (他支援的註解也可以是  {@Scheduled(cron = "0/10 * * * * *")}這種形式)

<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="syncAppDayJobCronTrigger
" /> </list> </property> </bean> <!-- CORE的所有任務--> <bean id="coreJob" class="live.mica.core.biz.job.CoreJob"/> <!-- 定時把每天日期放入快取 --> <bean id="syncAppDayJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="coreJob
"/> </property> <property name="targetMethod"> <value>syncAppDay</value> </property> <property name="concurrent" value="false"> </property> </bean> <bean id="syncAppDayJobCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="syncAppDayJob
" /> </property> <property name="cronExpression"> <!-- 每天0點5分 --> <value>0/10 * * * * ?</value> </property> </bean>
live.mica.core.biz.job.CoreJob
@Service
public class CoreJob {
	/**
     * 定時把每天日期放入快取
     */
       public void syncAppDay() {
        log.info("sync syncAppDay info start...");
        try {
        
        } catch (Exception ex) {
            log.error("fail to sync syncAppDay info.", ex);
        } finally {
            log.info("sync syncAppDay info end.");
        }
    }
}

其中需要注意的地方我用顏色標了出來,相同的顏色表示有對應關係。

很顯然,每個任務都是提前在xml裡配置的,沒辦法動態靈活新增啟用,

在15年使用了資料庫的註解,專案就是智慧傢俱的定時功能,但在17年的時候用spring boot做後臺的時候(是開源框架),使用了配置大於預設的註解,而且很規範,就想移植到當前的核心專案中,但是問題來了spring boot沒有任何宣告配置,就能使用這個定時,而我在普通專案的時候是有很多配置的,網上找也很片面,所以趁現在移植專案,寫一個比較傻瓜的文件(個人比較傾向傻瓜式code程式碼)

spring的jar包我就不說了,直接進入正題:

個人理解技術的主要思想:

spring 本身的定時很好,但是如果要加上動態新增隨意啟動的效果,需要比第一種方式多一個操作:

和 spring的job 公用一個任務工廠,當專案啟動時,去初始化定時器,然後把資料庫的定時資料 構建到spring的job中

紅色部分就是需要重點xml配置的地方:

    <!--新增quartz支援 -->
	<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
	
    <!--載入可執行的任務-->
        <bean id="scheduleJobService" class="live.mica.core.quartz.service.ScheduleJobService" init-method="init" />
live.mica.core.quartz.service.ScheduleJobService:
@Service
public class ScheduleJobService {
	@Autowired
    private Scheduler scheduler;
	
	
	private static final String CRON_DATE_FORMAT = "ss mm HH dd MM ? yyyy"; 
	
	/**
	 * 專案啟動時,初始化定時器
	 */
	@PostConstruct
	public void init(){
		
		List<ScheduleJobEntity> scheduleJobList = new arrayList<>();//查資料庫
		for(ScheduleJobEntity scheduleJob : scheduleJobList){
			CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
            //如果不存在,則建立
            if(cronTrigger == null) {
                //構建job資訊
            }else {
               //更新定時任務
            }
		}
	}
}

這是專案中移植的全部程式碼,xml裡的就上圖的兩句。



雖然程式碼多了點,但是結構比較清晰,支援連線池,分散式,雖然自己想寫的更詳細些,寫文件的時候發現大部分都是程式碼,核心其實很簡單,步驟很少。程式碼不好上傳,sorry~