Spring+Quartz定时器使用方法(任务的添加删除修改暂停恢复)

时间:2022-04-07 04:18:10

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.总结

以上代码是在编辑器直接写的,还没跑过。如有错误还请告知。
实际开发中,我们还需要更多的功能,例如,任务参数的传递,数据持久化,任务监听。