「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」
1、前言
上一篇的分享中,我为大家分享了基于Quartz实现定时任务的一些前置工作,本篇为大家介绍下具体的开发应用。
2、定时任务实现
这里,我是做了一些简单的封装,方便以后的开发。只需给出定时任务信息、实现具体接口即可。我们先来看下代码结构图,可以看到还是很简单的,这里并没有做过度封装。
//这个类主要是用来记录定时任务的信息用的
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;
}
}
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊