SpringBoot结合Quartz开发定时任务(二)

262 阅读3分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

1、前言

上一篇的分享中,我为大家分享了基于Quartz实现定时任务的一些前置工作,本篇为大家介绍下具体的开发应用。

2、定时任务实现

这里,我是做了一些简单的封装,方便以后的开发。只需给出定时任务信息、实现具体接口即可。我们先来看下代码结构图,可以看到还是很简单的,这里并没有做过度封装。

8.png

//这个类主要是用来记录定时任务的信息用的
public class QuartzInfo {
​
    /**
     * 任务名称
     */
    private String jobName;
​
    /**
     * 任务运行表达式
     */
    private String cronExpression;
​
    /**
     * 任务描述
     */
    private String description;
​
    /**
     * 创建时间
     */
    private Date creatTime;
​
    /**
     * 执行任务的handler
     */
    private QuartzJobExecute quartzJobExecute;
​
}
​
​
//通用Job类、这里通过实现Job接口,保证所有的定时任务都是自己的调度器执行的 PS:JobDataMap里的数据是通过JobDetail传递来的
public class QuartzJob implements Job {
​
    @Override
    public void execute (JobExecutionContext context) {
        QuartzInfo quartzInfo = (QuartzInfo) context.getMergedJobDataMap().get("quartzInfo");
        quartzInfo.getQuartzJobExecute().handleQuartzJob();
    }
​
}
​
​
//Quartz定时任务执行器 这里,通过继承此接口就可以实现定时执行
public interface QuartzJobExecute {
​
    /**
     * 执行Quarzt具体任务 
     */
    void handleQuartzJob();
​
}
 
​
//定时任务工具类
public class QuartzUtil { 
​
    /**
     * 根据jobName获取触发器 
     */
    public static CronTrigger getCronTrigger (Scheduler scheduler, String jobName) {
        //初始化触发器对象
        CronTrigger cronTrigger=null;
        try {
            //所有类型的trigger都有TriggerKey这个属性,表示trigger的身份
            TriggerKey triggerKey=TriggerKey.triggerKey(jobName);
            cronTrigger=(CronTrigger) scheduler.getTrigger(triggerKey);
        } catch (SchedulerException e) {
            logger.error("根据jobName获取触发器出错,错误信息:{}", e.getMessage(), e);
        }
        return cronTrigger;
​
    }
​
    /**
     * 创建任务 
     */
    public static void creatSchedulerJob (Scheduler scheduler, QuartzInfo quartzInfo) throws QuartzSchedulerException {
        //创建JobDetail对象
        @SuppressWarnings("unchecked") JobDetail jobDetail=JobBuilder.newJob(QuartzJob.class).withIdentity(quartzInfo.getJobName()).build();
        //在jobdetail中存入数据,调用job时可使用
        jobDetail.getJobDataMap().put("quartzInfo", quartzInfo);
        //表达式调度构建器
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzInfo.getCronExpression());
        //创建一个新的触发器
        CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(quartzInfo.getJobName()).withSchedule(cronScheduleBuilder).build();
        //启动任务
        try {
            scheduler.scheduleJob(jobDetail, cronTrigger);
        } catch (SchedulerException e) {
            throw new QuartzSchedulerException("创建任务失败!");
        }
    }
​
    /**
     * 暂停定时任务 
     */
    public static void pauseSchedulerJob (Scheduler scheduler, String jobName ) throws QuartzSchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName);
        try {
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            throw new QuartzSchedulerException("定时任务暂停失败!!");
        }
    }
​
    /**
     * 删除定时任务 
     */
    public static void deleteTask (Scheduler scheduler, String jobName) throws QuartzSchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName);
        try {
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            throw new QuartzSchedulerException("定时任务删除失败!!!");
        }
    }
​
}
 
//项目启动时初始化定时任务
@Component
@DependsOn({"CommentNlpJob"})
@Scope("singleton")
public class QuartzJobInit { 
​
    @Resource
    private Scheduler scheduler;
​
    @Resource
    private CommentNlpJob CommentNlpJob;
​
    @PostConstruct
    public void jobInit () {
        try {
            //1、初始化 PS:这里我偷了个懒,因为只有一个定时任务,就在代码里写死了,正常情况下应该从数据库获取任务信息的
            QuartzInfo quartzInfo = genStatisticalCommentJob();
            QuartzUtil.creatSchedulerJob(scheduler, quartzInfo);
        } catch (Exception e) {
            logger.error("【定时统计正负向评论】初始化失败,错误信息:{}", e.getMessage(), e);
        }
    }
​
    /**
     * 生成【调用百度NLP统计正负向评论】的QuartzInfo 
     */
    private QuartzInfo genStatisticalCommentJob() {
        QuartzInfo quartzInfo = new QuartzInfo();
        quartzInfo.setJobName("statistical_nlp_comment_job");
        quartzInfo.setQuartzJobExecute(CommentNlpJob);
        quartzInfo.setCreatTime(new Date());
        quartzInfo.setDescription("调用百度NLP统计正负向评论。");
        //每天的凌晨1点开始统计前一天的正负向评论
        quartzInfo.setCronExpression("0 0 1 * * ? *");
        return quartzInfo;
    }
​
}

好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊