一、包
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用法实例
发布评论