Quartz任務調度器

jopen 11年前發布 | 40K 次閱讀 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();
    }
}


 

控制臺輸出:

Quartz任務調度器

 

任務調度表達式:

http://www.cnblogs.com/archie2010/archive/2011/03/15/1984820.html

來自:http://blog.csdn.net/lb85858585/article/details/8600719

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!