案例-使用Quartz框架編寫定時任務

Quartz框架

任務(Job):需要執行的具體工作

觸發器(Trigger):在特定的時間觸發任務的執行

調度器(Scheduler):任務的實際執行者,負責粘合任務和觸發器。

案例:

新建maven項目,添加Quartz依賴

    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>1.8.6</version>
    </dependency>

新增任務明細類

package cn.quartz;

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

public class RemindJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("任務正在執行!");
    }
}

測試類與cron表達式相關介紹,注意,觸發器有兩種創建方式,SimpleTrigger 與 CronTrigger

package cn.quartz;

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

import java.util.Date;

public class TestMain {

    public static void main(String[] args) throws Exception {

        //創建任務
        JobDetail jobDetail = new JobDetail("myJob","A",RemindJob.class);

        //創建觸發器,指定固定時間間隔觸發器:SimpleTrigger,通過設置觸發器的屬性:開始時間、結束時間、重複次數、重複間隔等
        //輪詢模式,每三秒執行一次
        SimpleTrigger simpleTrigger =
                new SimpleTrigger("mySimpleTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
        //設置開始時間位當前時間的下一秒
        simpleTrigger.setStartTime(new Date(System.currentTimeMillis()+1000));

        //指定時間點的觸發器(比如每天凌晨3點執行一次):CronTrigger,實際開發中常用
        //第三個參數,cron表達式,按位置分別表示爲
        //秒 分 時 月份中的哪一天 月 星期幾 年
        //按空格分隔,其中(月份中的哪一天)與(星期幾)表示任意值時可用 ‘?’或‘*’ 號,其他字段表示任意值用‘*’號
        //除了可以設置某個固定值,還可以設置一個範圍(-)、一個列表(逗號間隔)、遞增(初始值/增量)如:
        //"* 25-30 1 * * ?" :表示凌晨1點25分到30分的範圍執行
        //"* 20,30,40 1 * * ?" :表示凌晨1點20分,30分,40分執行
        //"* 10/5 1 * * ?" :表示凌晨1點10分開始,每5分鐘執行一次
        //注意:(月份中的哪一天)與(星期幾)字段不能同時使用‘?’,也不能同時使用'*'號,年字段可以省略(至少保證表達式中存在6個字段)
        //表示12時57分40秒執行
        CronTrigger cronTrigger = new CronTrigger(",myCronTrigger", "B", "40 57 12 ? * *");


        //創建調度器
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler =  schedulerFactory.getScheduler();

        //調度器綁定任務與觸發器
        //scheduler.scheduleJob(jobDetail, simpleTrigger);
        scheduler.scheduleJob(jobDetail,cronTrigger);

        //調度器執行任務
        scheduler.start();

        
        //模擬主線程睡20秒後觸發調度器停止
        Thread.sleep(20000);
        //調度器停止任務
        scheduler.shutdown();



    }
}

在與Spring整合的項目中,可在Controller層在任務方法上直接使用

@Scheduled(cron="0 0/10 * * * ?") 註解,就會定時執行該任務方法。

spring配置文件中需引入spring-task.xsd文件

在類中使用@Scheduled註解時,需要spring能掃到該類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章