Quartz使用介紹

Qaurtz簡介

Quartz是一個徹底由java編寫的任務調度框架。
那麼什麼是任務調度呢?不少時候你可能會收到某個需求,要求程序 「 隔某個特定的時間段 在某個特定的時間 作某個特定的事情 」,好比:java

  1. 天天早上8:00自動發送早安給你的爸爸媽媽
  2. 每一年12月1日0點發送生日祝福給你的朋友
  3. 每月的9號自動還款螞蟻花唄

這些都是任務調度。而Quartz就是能夠方便你建立各類任務定時執行的一個框架,並且觸發這些任務的時間點能夠設計的很是複雜,幾乎都能完美匹配你的要求。web

優勢

  1. 簡單高效。Quartz用起來很是簡單。你只要寫一個繼承org.quartz.Job的job類,將邏輯寫入execute()方法,並將這個類設定好時間,以後Quartz就能自動幫你監控這個任務,到了指定時間自動執行,就再也不須要你管這些任務了。
  2. 容錯。 若是其中的一個節點掛了,並不會影響其餘節點上面任務的執行。
  3. 支持分佈式

主要API

  • Scheduler - 與調度器交互的主要API。
  • Job - 須要被調度器調度的任務必須實現的接口。
  • JobDetail - 用於定義任務的實例。
  • Trigger - 用於定義調度器什麼時候調度任務執行的組件。
  • JobBuilder - 用於定義或建立JobDetail的實例 。
  • TriggerBuilder - 用於定義或建立觸發器實例。

實例介紹

使用Quartz開發,首先,你要寫一個實現org.quartz.Job的類,重寫org.quartz.Job接口惟一的方法execute(),在這個方法裏面寫你要定時執行的代碼。服務器

public class TestJob implements Job{

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
            
            Date date=new Date();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.print("now:"+sf.format(date));

    }
}

而後,建立一個執行任務的類,建立scheduler,這能夠理解爲一個調度程序-任務執行計劃表,在這個表裏面對各個job任務進行時間分配。框架

SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler schedule = sfact.getScheduler();

而後,建立JobDetail的實例,指定執行哪一個job。分佈式

JobDetail jobDetail1 = JobBuilder.newJob((Class<? extends Job>) TestJob.class) //定義Job類爲TestJob類
                .withIdentity("myjob1", "group1") //定義name、group
                .build();

而後,建立一個CronTrigger實例,指定執行時間。ui

CronTrigger trigger1 =(CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 10 ? * MON")) //每週一早上十點執行
                .build();

最後,將哪一個job由哪一個trigger觸發安排設置進調度程序-任務執行計劃表,並啓動它。.net

schedule.scheduleJob(jobDetail1, trigger1);
schedule.start();

至此,一個定時任務就寫出來了,真的很簡單。
完整代碼以下:設計

public class QuartzLoad {
    private static Scheduler sched; 
    public static void run() throws Exception { 
        
        //一個job能夠對應多個tigger,可是一個trigger不能對應多個job。
        System.out.println("啟動定時任務");
        
        //建立Scheduler
        SchedulerFactory sfact = new StdSchedulerFactory();
        sched = sfact.getScheduler();
        
        //每週一早上8點執行任務
        JobDetail jobDetail1 = JobBuilder.newJob((Class<? extends Job>) TestJob.class)
                .withIdentity("myjob1", "group1").build();
        
        CronTrigger trigger1 =(CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 8 ? * MON")) 
                .build();
          
        schedule.scheduleJob(jobDetail1, trigger1);
        schedule.start();
    }
    //中止  
    public static void stop() throws Exception{  
           sched.shutdown();  
     }  
}

能夠先用main方法啓動試試,若是是web項目能夠用監聽器啓動。例:code

/**
 * 監聽器
 *
 */
public class TimingTaskSchedule implements ServletContextListener{

    // 服務器啓動時執行該事件
    public void contextInitialized(ServletContextEvent arg0) {
        try {
            QuartzLoad.run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 服務器中止時執行該事件
    public void contextDestroyed(ServletContextEvent arg0) {
        try {
            QuartzLoad.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Trigger

Quartz提供了多種觸發器,比較經常使用的有 CronTrigger和SimpleTrigger ,建立觸發器時的時間表達式怎麼寫?見這篇博客:點擊連接orm

相關文章
相關標籤/搜索