Quartz任務調度器
背景:</strong>
近期項目中遇到跨區調撥商品的需求,比如A區和B區,需要判斷A區或者B區某種sku是否需要從對方庫調撥商品來補充貨源,避免因缺失商品而出現訂單延誤,影響銷售和對用戶產生不良影響。</span>
問題:
數據量龐大,如果當查看的時候去獲取數據,那么會嚴重影響系統的性能,甚至導致數據庫和應用服務器無法響應。
解決方案:
規定在某個時間點,最好是在晚上12點時系統自動獲取需要調撥的數據,然后將數據存儲到數據庫中。晚上12點,用戶訪問量和系統的其它工作最少,這個時候啟動一個定時線程來獲取數據對系統的影響幾乎沒有。
采用技術:
Quartz,Quartz是一個開源的作業調度框架,它完全由Java寫成,并設計用于J2SE和J2EE應用中。它提供了巨大的靈活性而不犧牲簡單性。可以使用這個框架來完成定時任務的調度。
使用步驟:
1、編寫業務處理模塊。
該模塊針對本需求,首先獲取近期需要調度的sku列表,這是比較耗時的,因為需要查看近20天的
進銷存記錄并統計發貨數量。
其次判斷發貨量是否滿足某種條件(條件為業務內容,條件準備比較復雜)來進行補貨,當滿足時,查看其它庫區同種sku是否滿足調撥條件。
再次記錄兩庫的日均發貨量。
當上述條件滿足時,生成數據,如果不滿足則跳過,進行下一個sku判斷,直到所有sku處理完畢。
Demo:
業務處理模塊:
package com.tgb.test;
public class BusinessJob {
public void generateBusinessInfo(){
System.out.println("業務數據產生完畢!");
}
}
定時任務模塊:
package com.tgb.test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TimeJob implements Job {
//重寫方法
public void execute(JobExecutionContext context)throws JobExecutionException {
BusinessJob businessJob = new BusinessJob();
businessJob.generateBusinessInfo();
}
}
定時調度模塊:
package com.tgb.test;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
public class JobSchedule {
private static Scheduler scheduler = null;
private static final Object lock = new Object();
public static Scheduler getSchedulerInstance(){
if(scheduler == null){
synchronized(lock){
if(scheduler == null){
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
} catch (SchedulerException e) {
return null;
}
}
}
}
return scheduler;
}
/**
* 添加任務
* @param jobName任務名稱
* @param jobGroup任務組名稱
* @param jobClass任務類對象
* @param cronExpress定時調度表達式
*/
public void addJob(String jobName, String jobGroup, Class jobClass, String cronExpress){
try{
JobDetail jobDetail = new JobDetail(jobName, jobGroup, jobClass);
//創建觸發器對象,并為它設置名稱,組名稱,及任務調度的時間參數
CronTrigger cronTrigger = new CronTrigger("trigger1", "triggerGroup");
cronTrigger.setCronExpression(cronExpress);
//配置JobDetail和Trigger對象
JobSchedule.getSchedulerInstance().scheduleJob(jobDetail, cronTrigger);
}catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 啟動調度器
*/
public void startScheduler(){
try{
if(!JobSchedule.getSchedulerInstance().isStarted()){
JobSchedule.getSchedulerInstance().start();
}
}catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 停止調度器
*/
public void stopScheduler(){
try{
if(JobSchedule.getSchedulerInstance().isStarted()){
JobSchedule.getSchedulerInstance().shutdown(true);
}
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
主線程入口:
package com.tgb.test;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
//構造定時模塊
TimeJob timeJob = new TimeJob();
//構造調度管理者
JobSchedule jobSchedule = new JobSchedule();
//添加job
jobSchedule.addJob("jobName", "jobGroup", timeJob.getClass(), "0 0 23 * * ?");
//啟動調度器
jobSchedule.startScheduler();
//關閉調度器
// jobSchedule.stopScheduler();
}
}
控制臺輸出:

任務調度表達式:
http://www.cnblogs.com/archie2010/archive/2011/03/15/1984820.html
來自:http://blog.csdn.net/lb85858585/article/details/8600719