1. 程式人生 > >Quartz 任務調度框架之Hello World

Quartz 任務調度框架之Hello World

yun led factor tel 觸發 xsd 定時 get code

0x01 什麽是Quartz?

Quartz是一個完全由java編寫的開源作業調度框架。

0x02 實戰Quartz Hello World

創建Maven項目,POM 文件配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <
modelVersion>4.0.0</modelVersion> <groupId>com.xingyun</groupId> <artifactId>quartz.sample</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Quartz Sample</name> <dependencies> <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz
--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> </dependencies> </project>

創建一個定時需要執行的作業

HelloJob.java

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

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

public class HelloJob implements Job{
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //打印當前的執行時間 例如 2017-11-23 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("現在的時間是:"+ sf.format(date));
        //具體的業務邏輯
        System.out.println("Hello Quartz");
    }
}

這個作業很簡單,定時打印當前時間。

由於時間有關,因此我們需要一個工具類來做時間格式轉化

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

public class DateUtil {
    /**
     * 將長時間格式字符串轉換為時間 yyyy-MM-dd HH:mm:ss
     * 
     * @param strDate
     * @return
     */
  public static Date strToDateLong(String strDate) {
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     ParsePosition pos = new ParsePosition(0);
     Date strtodate = formatter.parse(strDate, pos);
     return strtodate;
  }
}

主方法調用

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class MainTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
        
            //創建一個jobDetail的實例,將該實例與HelloJob Class綁定
            JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
            //創建一個Trigger觸發器的實例,定義該job立即執行,並且每2秒執行一次,一直執行
            SimpleTrigger trigger = TriggerBuilder.
                    newTrigger().
                    withIdentity("myTrigger").
                    startNow().
                    endAt(DateUtil.strToDateLong("2018-11-06 16:56:22")).
                    withSchedule(
                            SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(2).repeatForever()).build();
            //創建schedule實例
            StdSchedulerFactory factory = new StdSchedulerFactory();
            Scheduler scheduler = factory.getScheduler();
            scheduler.start();
            scheduler.scheduleJob(jobDetail,trigger);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            System.out.println(e.toString());
        }
    }

}

值得註意的一點:

我們定時任務從

2018-11-06 16:55:22開始任務調度

當定時任務到

2018-11-06 16:56:22 之前停止任務調度

也就是說
endAt 的含義是 當執行到 2018-11-06 16:56:20 時發現到達我們設置的終點值,此時終止任務調度。

而不是恰好等於
2018-11-06 16:56:22

打印結果:

技術分享圖片

Quartz 任務調度框架之Hello World