1. 程式人生 > >Java Quartz 構建定時排程任務

Java Quartz 構建定時排程任務

前言

在日常開發中,我們經常會遇見這樣的情況,我們要在指定的時間去執行一個任務,或者週期性在某個時間點上執行一個任務,這種事情讓人去操作顯然是不合適的,因此,我們可以使用Quartz來實現我們的要求。
Quartz對於Java提供友好的API和文件,幫助我們構建定時排程任務,本文中的quartz版本為2.2版本。

介紹Quartz

quartz是一個開源的定時排程類庫,使用它可以簡單方便的在指定的時間或時間週期內執行定時任務,關於quartz的幾個核心API需要先介紹一下:

  • Scheduler:核心任務排程器
  • Job:你需要被排程器執行的任務需要實現的一個介面
  • JobDetail:每個任務的具體細節
  • Trigger:一個定義了排程器上面需要有哪些任務需要被執行的元件
  • JobBuilder:通常用來構建/定義 JobDetail例項
  • TriggerBuilder:通常用來構建/定義 Trigger例項

實現

maven依賴:

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.3</version
>
</dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.5.RELEASE</version> </dependency>

如果使用的Spring容器,需要多加一個Spring的支援依賴。

然後我們首先開始建立一個Job任務:

public class ExecuteJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        String  name = context.getJobDetail().getKey().getName();
        System.out.println("定時排程啟動成功");
    }
}

我們建立了一個Job定時任務,這裡獲取了一個name屬性,這個我們到後邊再說。

然後我們開始建立定時任務排程:

public class schedule {
    public void operateSchedule() {
        //1.建立Scheduler的工廠
        SchedulerFactory sf = new StdSchedulerFactory();
        try {
            //2.從工廠中獲取排程器例項
            Scheduler scheduler = sf.getScheduler();
            //3.啟動 排程器
            scheduler.start();
            //4.建立JobDetail
            JobDetail jobDetail =
            JobBuilder.newJob(ExecuteJob.class)
            .withDescription("資料庫操作定時任務")
            .withIdentity("jobName", "group")
            .usingJobData("name", 1)
            .build();

            //5.建立Trigger
            Trigger trigger = TriggerBuilder.newTrigger()
            .withDescription("定時任務,可自定義時間,執行一次")
            .withIdentity("jobName", "group")
            //預設在當前時間啟動
            .startAt(new Date())    
            //重複執行的次數       
            .withSchedule(            
            SimpleScheduleBuilder.simpleSchedule()
            .withRepeatCount(0))
            .build();

            //6.註冊任務和定時器
            scheduler.scheduleJob(jobDetail, trigger);          
        } catch (Exception e) {
            e.printStackTrace();    
        }
    }
}

上面的程式碼展示建立一個定時排程任務每一步;
第一步需要建立Scheduler的工廠;
第二步從工廠中獲取排程器例項;
第三步啟動排程器;
第四步建立JobDetail,在JobDetail中,我們可以設定job的名稱與group名稱,並傳遞一個引數值進去,這裡傳遞的值在Job具體執行的地方可以獲取到,就是在我們最開始的地方看到的程式碼;
第五步建立Trigger,Trigger需要配置一下Job的name與group,並設定任務開始執行的時間,與執行的週期頻度
第六步註冊任務和定時器,註冊完成後,任務將會在指定的時間去呼叫Job執行。

總結

相比於在Spring中通過配置檔案的方式,通過API進行呼叫的方式更加的靈活,可以動態執行執行,也可以動態停止執行定時任務,在本文中只展示瞭如何建立並啟動一個任務,關於更多使用的方式可以參見官方的文件Quartz Tutorials