1. 程式人生 > >Quartz 實現定時任務

Quartz 實現定時任務

Quartz 是一個功能強大的作業排程工具,相當於資料庫中的 Job、Windows 的計劃任務、Unix/Linux 下的 Cron,但 Quartz 可以把流程控制的更精細。而且 Quartz1.✘ 版本可以和 Spring 進行結合。

本文使用的 Quartz:

 <groupId>org.quartz-scheduler</groupId>
 <artifactId>quartz</artifactId>
 <version>2.3.0</version>

參考教程:
https://blog.csdn.net/yangshangwei/column/info/17954


https://blog.csdn.net/u010377605/article/details/77801896/

Quartz 中的 Log 功能依賴於 slf4j:

  • org.slf4j:slf4j-api

  • org.slf4j:slf4f-simple

  • 定義一個簡單的 Job 類:

import org.quartz.*;

import java.util.Date;

public class ExampleJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobKey key = jobExecutionContext.getJobDetail().getKey();
        System.out.println("Instance: "+key+"------------------");
        System.out.println("Date: " + new Date());
        JobDataMap properties = jobExecutionContext.getJobDetail().getJobDataMap();
        System.out.println("float: " + properties.getFloat("float"));
        System.out.println("Previous Fire Time: " + jobExecutionContext.getPreviousFireTime());// 上次執行時間
        System.out.println("Current Fire Time: " + jobExecutionContext.getFireTime());// 本次執行時間
        System.out.println("Next Fire Time: " + jobExecutionContext.getNextFireTime());// 下一次執行時間
    }
}


  • 定義了屬性和 Get Set 函式的 Job 類:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

/**
 * 具體執行的任務
 */
public class ClassJob implements Job {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobKey key = context.getJobDetail().getKey();
        System.out.println("Instance " + key + ",姓名:" + name + ",年齡:" + age);
    }
}
  • 使用示例:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

/**
 * 依賴於:
 * org.slf4j:slf4j-api
 * org.slf4j:slf4f-simple
 *
 * 教程:
 * https://blog.csdn.net/yangshangwei/column/info/17954
 */

public class Console {
    public static void main(String[] args) {
        try {
            testJob();
            testClassJob();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 測試使用quartz實現的排程任務
    public static void testJob() throws SchedulerException, InterruptedException {
        // 建立排程者工廠
        SchedulerFactory sfc = new StdSchedulerFactory();
        // 通過工廠建立一個排程者
        Scheduler scheduler = sfc.getScheduler();
        //----------Quartz 2.3.0的寫法---------------//
        JobDetail myJob = newJob(ExampleJob.class)
                .withIdentity("myJob", "job-group")
                .usingJobData("float", 3.14f)
                .build();
        Trigger trigger = newTrigger()
                .withIdentity("mytrigger", "trigger-group")
                .startAt(new Date())
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(3)
                        .repeatForever())
                .build();// 排程任務,每隔一定時間執行
        Date startDate = scheduler.scheduleJob(myJob, trigger);
        System.out.println(myJob.getKey() + " will start at:" + startDate);
        // 開始執行排程程式
        scheduler.start();
        Thread.sleep(10000);// 等待一定時間
        scheduler.shutdown();// 關閉排程程式
        SchedulerMetaData metaData = scheduler.getMetaData();
        System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
        System.out.println("Test end------>");
    }

    public static void testClassJob() throws SchedulerException, InterruptedException {
        SchedulerFactory sfc = new StdSchedulerFactory();
        Scheduler scheduler = sfc.getScheduler();
        JobDetail myJob = newJob(ClassJob.class)
                .withIdentity("myJob", "job-group")
                .usingJobData("name", "User")
                .usingJobData("age",12)
                .build();
        Trigger trigger = newTrigger()
                .withIdentity("mytrigger", "trigger-group")
                .startAt(new Date())
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(3)
                        .repeatForever())
                .build();
        Date startDate = scheduler.scheduleJob(myJob, trigger);
        System.out.println(myJob.getKey() + " will start at:" + startDate);
        scheduler.start();
        Thread.sleep(10000);// 等待一定時間
        scheduler.shutdown();// 關閉排程程式
        SchedulerMetaData metaData = scheduler.getMetaData();
        System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
        System.out.println("Test end------>");
    }
}