Java 定時任務quartz


quartz定時任務

一、添加Maven依賴

    <!-- 定時任務 -->
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.3.0</version>
    </dependency>

二、創建執行任務的任務類

如下所示:創建了TestJob01並實現了Job,該任務只是簡單的打印當前時間

package cn.wh.job;

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

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

/**
 * 定時執行任務的任務類-測試
 * @author wanghao
 *
 */
public class TestJob01 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println("任務打印"+sdf.format(new Date()));
    }
}

三、創建調用任務的調度類

 

package cn.wh.scheduler;

import cn.wh.job.TestJob01;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 任務調度類
 */
public class TestJob01Scheduler {

    //創建調度器
    public static Scheduler getScheduler() throws SchedulerException {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        return schedulerFactory.getScheduler();
    }

    // 執行任務
    public static void run() throws SchedulerException{
        //創建任務
        JobDetail jobDetail = JobBuilder.newJob(TestJob01.class).withIdentity("testJob01", "group11").build();
        //創建觸發器 每5秒鍾執行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group21")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
                .build();
        Scheduler scheduler = getScheduler();
        //將任務及其觸發器放入調度器
        scheduler.scheduleJob(jobDetail, trigger);
        //調度器開始調度任務
        // 啟動
        if (!scheduler.isShutdown()) {
            scheduler.start();
        }
    }

    public static void main(String[] args) throws SchedulerException {
        TestJob01Scheduler testJob01Scheduler = new TestJob01Scheduler();
        testJob01Scheduler.run();
    }
}

執行結果如下圖所示:每隔五秒執行一次

 執行過程如下圖:


使用Cron表達式,執行定時任務

Cron表達式包含6個必要組件和一個可選組件,如下表所示。

 

位置

含義

允許的特殊字符

1

秒(0~59)

, -  *  /

2

分(0~59)

, -  *  /

3

小時(0~24)

, -  *  /

4

日期(1~31)

, -  *  /  ?  L  W  C

5

月(JAN~DEC或1~12)

, -  *  /

6

星期(SUN~SAT或1~7)

, -  *  /  ?  L  C  #

7

年(可選,1970~2099),若為空,表示全部時間范圍

, -  *  /

 
特殊字符的含義,見下表。
 

特殊字符

說明

*

通配符,任意值

?

無特定值。通常和其他指定的值一起使用,表示必須顯示該值但不能檢查

-

范圍。e.g.小時部分10-12表示10:00,11:00, 12:00

,

列分隔符。可以讓你指定一系列的值。e.g.在星期域中指定MON、TUE和WED

/

增量。表示一個值的增量,e.g.分鍾域中0/1表示從0開始,每次增加1min

L

表示Last。它在日期和星期域中表示有所不同。在日期域中,表示這個月的最后一天,而在星期域中,它永遠是7(星期六)。當你希望使用星期中某一天時,L字符非常有用。e.g.星期域中6L表示每一個月的最后一個星期五

W

在本月內離當天最近的工作日觸發,所謂的最近工作日,即當天到工作日的前后最短距離,如果當天即為工作日,則距離是0;所謂本月內指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天確實滿足最近工作日。e.g. LW表示本月的最后一個工作日觸發,W強烈依賴月份。

#

表示該月的第幾個星期,e.g. 1#2表示每一個月的第一個星期一

C

日歷值。日期值是根據一個給定的日歷計算出來的。在日期域中給定一個20C將在20日(日歷包括20日)或20日后日歷中包含的第一天(不包括20日)激活觸發器。例如在一個星期域中使用6C表示日歷中星期五(日歷包括星期五)或者第一天(日歷不包括星期五)

 

代碼如下:

package cn.wh.utils;

import cn.wh.job.TestJob01;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzManager {

    private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
    private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
    private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";

    /**
     * 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名
     * @param jobName 任務名
     * @param cls 任務
     * @param time 時間設置
     */

    public static void addJob(String jobName, Class cls, String time) {
        try {
            // org.quartz-scheduler
            Scheduler sched = gSchedulerFactory.getScheduler();
            // 任務名,任務組,任務執行類
            //創建任務
            JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, TRIGGER_GROUP_NAME).build();
            //可以傳遞參數
            jobDetail.getJobDataMap().put("param", "railsboy");
            // 觸發器
            //每秒鍾觸發一次任務
            CronTrigger trigger = TriggerBuilder.newTrigger().
                    withIdentity(jobName, TRIGGER_GROUP_NAME).
                    withSchedule(CronScheduleBuilder.cronSchedule("*/3 * * * * ? *")).
                    build();
            // 觸發器時間設定
            sched.scheduleJob(jobDetail, trigger);
            // 啟動
            if (!sched.isShutdown()) {
                sched.start();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        QuartzManager.addJob("Test01",TestJob01.class,"");
    }
}

可以看到任務每三秒執行一次。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM