1. 程式人生 > >淺談Quartz的Job和JobDetails

淺談Quartz的Job和JobDetails

一 點睛

1 Job定義

實現業務邏輯的任務介面。

Job介面非常容易實現,只有一個execute方法,類似TimeTask的run方法,在裡面編寫業務邏輯。

2 Job介面原始碼

public interface Job {
    void execute(JobExecutionContext context)
        throws JobExecutionException;

}

3 Job例項在Quautz中的生命週期

每次排程器執行job時,它在呼叫execute方法前會建立一個新的job例項。

當呼叫完後,關閉的job物件例項會被釋放,釋放的例項會被垃圾回收機制回收。

4 淺談JobDetail

JobDetail為Job例項提供了許多設定屬性,以及JobDataMap成員變數屬性,它用來儲存特定Job例項的狀態資訊,排程器需要藉助JobDetail物件來新增Job例項。

下面4個是JobDetail的重要屬性

name、group、jobClass、jobDataMap

二 實戰

1 啟動類

package com.quartz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;

public class HelloScheduler {

    public static void main(String[] args) throws SchedulerException {
        //建立一個JobDetail例項, 將該例項與hellojob class 繫結
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();
        //演示JobDetail的重要屬性
        System.out.println("jobDetail's name:"+jobDetail.getKey().getName());
        System.out.println("jobDetail's group:"+jobDetail.getKey().getGroup());
        System.out.println("jobDetail's jobclass:"+jobDetail.getJobClass().getName());

        //建立一個Trigger例項,定義該job立即執行,並且每隔兩秒鐘重複執行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger","group1")
                .startNow().withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(2).repeatForever()
                ).build();
        //建立Schedule例項
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time is:" + simpleDateFormat.format(date));
        scheduler.scheduleJob(jobDetail,trigger);
    }
}

2 Job類

package com.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.text.SimpleDateFormat;
import java.util.Date;


public class HelloJob implements Job{

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //列印當前執行的時間
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
        //編寫具體的業務邏輯
        System.out.println("Hello World!");
    }
}

三 執行結果

jobDetail's name:myJob

jobDetail's group:DEFAULT

jobDetail's jobclass:com.quartz.HelloJob