1. 程式人生 > >Quartz使用(6) - Quartz項目實戰

Quartz使用(6) - Quartz項目實戰

hid ffline redis 保密 調用 框架 調度 可靠性 list

本片博文將闡述項目工作中使用Quartz的情況,包含項目背景、項目框架、Quartz集群部署等方面,重點講述如何在實際項目中使用Quartz。

1. 背景

因項目需求,需要定時調用數據下載接口,並將數據存儲至諸如mongo、redis、elasticsearch等數據庫或緩存中。具體涉及到的需求如下:

a. 調用接口的任務均從mongo數據庫讀取;

b. 任務的個數隨著業務量的增加而增加;

c. 每個調用任務的定時執行時間可能不同,且定時執行時間在mongo中可配置;

d. 任務的執行需要動態更新,如檢測到某一任務的定時時間發生變化,則任務的執行也需要實時修改

e. mongo、redis、elasticsearch等數據庫中所存儲的字段也由mongo進行配置;

f. 任務執行需要實時性較高、可靠性較強、可擴展性較高等

綜上需求,調研了一番,發現任務調度框架Quartz可滿足項目需求。

2. 框架

基於項目的需求,結合任務調度框架Quartz,大體的流程框架如下圖所示:

技術分享圖片

1) 首先構建從mongo加載任務

2) 將任務的配置信息初始化至Quartz

3) 通過Quartz的Job任務實現定時調用下載接口任務

4) 將下載的數據依據配置,存儲至數據庫中

5) 定時檢測任務通過定時掃描mongo數據庫,查看相關任務信息的配置是否發生變化,如果發生變化,則進行動態更新

6) 為了實現高可用性、可擴展性,可以直接使用Quartz原生的集群特性。

3. 核心代碼

核心代碼將會涵蓋上述流程圖中的相關環節,為了項目的保密性,相關信息也會隱藏。

3.1 任務主流程  

技術分享圖片
import com.quartz.conf.Configuration;
import com.quartz.conf.OcpConfHelper;
import com.quartz.module.TaskInfo;
import org.apache.log4j.PropertyConfigurator;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; public class SchedulerRunner { static Logger logger = LoggerFactory.getLogger(SchedulerRunner.class); public static void main(String[] args) { // 加載日誌配置文件 PropertyConfigurator.configure("./conf/log4j.properties"); // 加載quartz配置文件 System.setProperty("org.quartz.properties", "./conf/quartz.properties"); // 執行任務解析與調度 run(); } public static void run(){ // 獲取配置信息表 List<TaskInfo> taskInfos = GenerateTaskInfo.generateTaskInfoFromMysql(); if(taskInfos.size() == 0){ logger.info("there is no tasks from mongoInfo"); return; } // 過濾下線任務 taskInfos = GenerateTaskInfo.filterTask(taskInfos); if(taskInfos.size() == 0){ logger.info("all tasks if offline, no need to run"); return; } Scheduler scheduler = null; try { scheduler = StdSchedulerFactory.getDefaultScheduler(); } catch (SchedulerException e) { e.printStackTrace(); } if(scheduler == null){ logger.error("create scheduler failed"); return; } if(isSchedulerClear()){ clearSchedulerJob(scheduler); } // 加入任務調度 for(TaskInfo task : taskInfos){ SchedulerFactory.addJob2Scheduler(task, scheduler); } // 加入動態更新任務 SchedulerFactory.addDynamicUpdateJob2Scheduler(scheduler); // 開啟任務 try { scheduler.start(); } catch (SchedulerException e) { logger.error("start scheduler error!"); } } public static void clearSchedulerJob(Scheduler scheduler){ try { scheduler.clear(); } catch (SchedulerException e) { logger.error("clear scheduler error!"); } } /** * 基於配置文件中的信息,加載調度器開始運行時的清洗標識 * @return */ private static boolean isSchedulerClear(){ Configuration conf = OcpConfHelper.getInstance().getOcpConf(); return conf.getBooleanValue("cleanSchedulerFlag", "true"); } }
View Code

Quartz使用(6) - Quartz項目實戰