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