admin管理员组

文章数量:1794759

Schedule用法实例

Schedule用法实例

一、包

import org.quartz.CronTrigger; import org.quartz.DateBuilder; import org.quartz.JobBuilder; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.matchers.GroupMatcher;

二、方法

2.1 获得JobBuilder对象实例

private JobBuilder newJob(Class clss){ return JobBuilder.newJob(clss); }

2.2 获得TriggerBuilder对象实例

private TriggerBuilder newTrigger(){ return TriggerBuilder.newTrigger(); }

2.3 事件触发:日期转换为分钟

private Date evenMinuteDate(Date date){ return DateBuilder.evenMinuteDate(date); }

2.4 事件触发:日期转换为秒

private Date evenSecondDate(Date date){ return DateBuilder.evenSecondDate(date); }

2.5获得JobDetail实例对象

/** * 获得JobDetail实例对象 * @param faxx 方案编号和模型编号是必填项 * @param clss * @return */ private JobDetail newJobDetail(BdFaxxPo faxx,Class clss){ JobDetail job = newJob(clss).withIdentity("BdFaxxJob_"+faxx.getId(),"BdFaxxJobGroup_"+faxx.getMxId()).build(); JobDataMap jobDataMap = job.getJobDataMap(); jobDataMap.put("BdFaxxPo", faxx); return job; }

2.6 构建触发器

/** * 构建触发器 * @param faxx 方案编号和模型编号,比对频率,单位,是必填项 * @param clss * @return */ private Trigger newTrigger(BdFaxxPo faxx,Class clss){ float faxxCycle = 0; if("0".equals(faxx.getCycleUnit())){//分钟 faxxCycle = faxx.getBdCycle()*60;//分换算成秒 }else if("1".equals(faxx.getCycleUnit())){//小时 faxxCycle = faxx.getBdCycle()*60*60;//小时换算成秒 } int faxxCycleInt = (int)faxxCycle; String triggerDesc = "方案名称:"+faxx.getName()+"(模型:"+faxx.getMxName()+"),"+DataDicUtil.getBdModelOpts().get(faxx.getBdModel())+"-"+DataDicUtil.getBdWayOpts().get(faxx.getBdWay())+"比对,频率:每"+faxxCycleInt+"秒比对一次"; log.info("starting "+triggerDesc); TriggerBuilder triggerBuilder = newTrigger().withIdentity("BdFaxxTrigger"+faxx.getId(),"BdFaxxTriggerGroup_"+faxx.getMxId()); //triggerBuilder.startNow(); Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.SECOND, faxxCycleInt+10); Date reminderStartTime=cal.getTime(); System.out.println(DateUtil.getDateByPatten(reminderStartTime, DateUtil.S_FULL_TIME_FORMAT)); triggerBuilder.startAt(reminderStartTime); //设置执行频率:方法1 //.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInSeconds(faxxCycleInt)) //设置执行频率:方法2 SimpleScheduleBuilder simpleScheduleBuilder=SimpleScheduleBuilder.simpleSchedule(); simpleScheduleBuilder.withIntervalInSeconds(faxxCycleInt); simpleScheduleBuilder.repeatForever();//如果不设置总发送次数,将一直运行 //System.out.println("hashCode:"+simpleScheduleBuilder.hashCode()); triggerBuilder.withSchedule(simpleScheduleBuilder); triggerBuilder.withDescription(triggerDesc); Trigger trigger = triggerBuilder.build(); return trigger; }

2.7 启动调度

/** * 启动调度 * @param job JobDetail * @param trigger Trigger * @throws SchedulerException */ private void startBdFaxxJob(JobDetail job,Trigger trigger) throws SchedulerException{ scheduler.scheduleJob(job, trigger); }

2.8 组合JobDetail、Trigger并启动调度

/**  * 组合JobDetail、Trigger并启动调度  * @param faxx  * @param clss  * @throws SchedulerException  */ public void startBdFaxxJob(BdFaxxPo faxx,Class clss) throws SchedulerException{  try {   //1、构建JobDetail作业   JobDetail job = newJobDetail(faxx ,clss );   //2构建Trigger 触发器   Trigger trigger = newTrigger(faxx ,clss);   //3、启动调度器 job 1:N Trigger`   startBdFaxxJob(job,trigger);             if(!scheduler.isStarted()){          scheduler.start();         }                 getPlanningJob(" last");   getExcetingJob(" last");  } catch (Exception e) {   e.printStackTrace();   log.error(e);  } }

2.9清理所有计划中的作业

/** * 清理所有计划中的作业 * @throws SchedulerException */ public void cleanAllJob() throws SchedulerException{ log.info("服务器启动,清理所有已存储的计划中的作业"); GroupMatcher<JobKey> matcher = GroupMatcher.groupContains("BdFaxxJobGroup"); Set<JobKey> jobKeys = scheduler.getJobKeys(matcher); for (JobKey jobKey : jobKeys) { scheduler.deleteJob(jobKey); } }

2.10 如果方案被删除,对应的任务也应该删除

/** * 如果方案被删除,对应的任务也应该删除 * @param bdFaxxList * @throws SchedulerException */ public void cleanUpJob(ScheduleJob scheduleJob) throws SchedulerException{ System.out.println("-------------清理任务----------------"); JobKey jobKey = new JobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup()); //删除任务后,所对应的trigger也将被删除 scheduler.deleteJob(jobKey);//清理执行历史 //参考接口 //scheduler.pauseTrigger(triggerKey);//停止触发器 //scheduler.unscheduleJob(triggerKey);//移除触发器 }

2.11 暂停与恢复作业

/** * 暂停任务 * @throws SchedulerException */ public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException{ JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.pauseJob(jobKey); } /** * 恢复任务 * @throws SchedulerException */ public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException{ JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.resumeJob(jobKey); }

2.12 项目启动时初始化,启动所有定时任务

/** * 项目启动时初始化,启动所有定时任务 */ public void startJobs(){ try{ if(!scheduler.isStarted()){ System.out.println("scheduler 正在启动"+!scheduler.isStarted()); scheduler.start(); }else{ System.out.println("scheduler 已经启动"); } cleanAllJob(); System.out.println("scheduler启动成功!"); }catch(Exception e){ e.printStackTrace(); } }

2.13 关闭所有定时任务

/** * 关闭所有定时任务 */ public void shutdownJobs(){ try{ if(!scheduler.isShutdown()){ scheduler.shutdown(true); } }catch(Exception e){ log.error(e.getMessage()); log.error(e); } }

本文标签: 实例schedule