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);
	}
}




猜你喜欢

转载自blog.csdn.net/unimme/article/details/49737389
今日推荐