Spring+Quartz定時器使用方法(任務的添加刪除修改暫停恢復)

1.前言

Spring 內置了quartz框架,可以對方法上註解或者在配置文件裏配置定時任務。但是如果需要對這些任務進行管理(增刪該查)的話不知道能不能做,反正我這渣渣是不知道的,所有我就自己整合了Quartz。

2.步驟

2.1 引入相關jar包

pom.xml

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


2.2 定時器執行任務類編寫

ListenJob.java

//保留任務執行後的數據,例如操作JobDataMap
@PersistJobDataAfterExecution 
//不允許並非執行任務
@DisallowConcurrentExecution
public class ListenJob implements Job{

//實現Job接口的方法
public void execute(JobExecutionContext content) throws JobExecutionException {

    /*任務執行內容在這裏編寫*/
    System.out.println("do something");

    }
}


2.3 一個任務類的執行需要有它的調度器,接下來編寫調度器

Scheduler.java

//這個@Service很關鍵
@Service
public class SchedulerJob{

    //通過schedulerFactory獲取一個調度器
    SchedulerFactory schedulerfactory = new StdSchedulerFactory();

    Scheduler scheduler = null;

    //添加任務
    public void addJob(){
        // 通過schedulerFactory獲取一個調度器
        scheduler = schedulerfactory.getScheduler();

        //初始化任務名和組名
        String jobName = "jobName";
        String jobGroupName = "jobGroupName";

        //初始化任務(ListenJob.class)
        JobDetail job = JobBuilder.newJob(ListenJob.class).withIdentity(jobName,jobGroupName).build();

        //設置任務開始時間
        Date startTime = new Date();

        //設置任務結束時間(開始時間一小時後)
        Date endTime = new Date(startTime.getTimer()+1000*60*60);

        //初始化任務的觸發器(起止時間,repeatSecondlyForever(1)表示每秒執行一次)
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().startAt(startTime).endAt(endTime).withIdentity("triggerName", "triggerGroupName")      .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).repeatForever()).build();

        //添加任務到調度器
        scheduler.scheduleJob(job, simpleTrigger);

        //開始執行
        if(!scheduler.isStarted()){
            scheduler.start();
        }  
    }


    //暫停任務
    public void pauseJob(){
        //調度器爲空
        if(scheduler==null){
            return;
        }
        try {
            //觸發器和任務都要暫停
            scheduler.pauseTrigger(new TriggerKey("triggerName","triggerGroupName"));
            scheduler.pauseJob(new JobKey("jobName"));          
        } catch (SchedulerException e) {
            e.printStackTrace();
        }   
    }

    //恢復調度器
    public void resumeJob(){
        //
        if(scheduler==null){
            return;
        }
        //
        try {
            scheduler.resumeJob(new JobKey("jobName"));
            scheduler.resumeTrigger(new TriggerKey("triggerName","triggerGroupName"));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }   
    }

    //刪除任務
    public void deleteJob(){
        if(scheduler==null){
            return;
        }
        //JobKey對象
        JobKey jobKey = new JobKey("jobName");
        //觸發器
        TriggerKey triggerKey = TriggerKey.triggerKey("triggerName", "triggerGroupName");
        try {
            // 停止觸發器
            scheduler.pauseTrigger(triggerKey);
            // 移除觸發器
            scheduler.unscheduleJob(triggerKey);
            //刪除任務
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }       
    }

    //修改任務
    public void alterJob(){
        // 創建一個新的觸發器
        TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
        // 新觸發器名,觸發器組
        triggerBuilder.withIdentity("newTriggerName", "newTriggerGroupName");
        // 新觸發器條件設置
        triggerBuilder.startNow();           

triggerBuilder.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2).repeatForever());

        // 創建Trigger對象
        SimpleTrigger trigger = (SimpleTrigger)triggerBuilder.build();

        //舊的觸發器
        TriggerKey triggerKey = TriggerKey.triggerKey("triggerName", "triggerGroupName");

        try {
            //修改觸發器
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }   
}

3.總結

以上代碼是在編輯器直接寫的,還沒跑過。如有錯誤還請告知。
實際開發中,我們還需要更多的功能,例如,任務參數的傳遞,數據持久化,任務監聽。

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