一、定义
为了更加简单的使用定时器,我们把创建、查询和删除定时器给封装起来。在 com.example.hxds.odr.quartz 包中创建 QuartzUtil.java 类。
@Component
@Slf4j
public class QuartzUtil {
@Resource
private Scheduler scheduler;
/**
* 添加定时器
*
* @param jobDetail 定时器任务对象
* @param jobName 任务名字
* @param jobGroupName 任务组名字
* @param start 开始日期时间
*/
public void addJob(JobDetail jobDetail, String jobName, String jobGroupName, Date start) {
try {
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName, jobGroupName)
//定时器种类:普通定时器。
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
//错过的定时器立即执行。
.withMisfireHandlingInstructionFireNow())
.startAt(start).build();
scheduler.scheduleJob(jobDetail, trigger);
log.debug("成功添加" + jobName + "定时器");
} catch (SchedulerException e) {
log.error("定时器添加失败", e);
}
}
/**
* 查询是否存在定时器
*
* @param jobName 任务名字
* @param jobGroupName 任务组名字
* @return
*/
public boolean checkExists(String jobName, String jobGroupName) {
TriggerKey triggerKey = new TriggerKey(jobName, jobGroupName);
try {
boolean bool = scheduler.checkExists(triggerKey);
return bool;
} catch (Exception e) {
log.error("定时器查询失败", e);
return false;
}
}
/**
* 删除定时器
*
* @param jobName 任务名字
* @param jobGroupName 任务组名字
*/
public void deleteJob(String jobName, String jobGroupName) {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
try {
//停下定时器
scheduler.resumeTrigger(triggerKey);
//解除定时器
scheduler.unscheduleJob(triggerKey);
//删除定时器任务
scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
log.debug("成功删除", + jobName + "定时器");
} catch (SchedulerException e) {
log.error("定时器删除失败", e);
}
}
}
二、使用
使用定时器工具类:
//先判断是否有分账定时器
if (quartzUtil.checkExists(uuid, "代驾单分账任务组") || quartzUtil.checkExists(uuid, "查询代驾单分账任务组") {
return;
}
//执行分账
JobDetail jobDetail = JobBuilder.newJob(HandleProfitsharingJob.class).build();
Map dataMap = jobDetail.getJobDataMap();
dataMap.put("uuid", uuid);
dataMap.put("driverOpenId", driverOpenId);
dataMap.put("payId", payId);
//2分钟之后执行分账定时器
Date executeDate = new DateTime().offset(DateField.MINUTE, 2);
quartzUtil.addJob(jobDetail, uuid, "代驾单分账任务组", executeDate);
//更新订单状态为已完成状态(8)
rows = orderDao.finishOrder(uuid);
if (rows != 1) {
throw new HxdsException("更新订单结束状态失败");
}
版权声明:本文为lambert00001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。