编写定时器工具类及使用

  • Post author:
  • Post category:其他


一、定义

为了更加简单的使用定时器,我们把创建、查询和删除定时器给封装起来。在 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 版权协议,转载请附上原文出处链接和本声明。