任务调度的核心概念为:
- 任务(job):最终实际要执行的操作
- 触发器(trigger):控制任务执行的时机
- 调度器(scheduler):借助触发器,对任务执行进行调度,相当于管理者
使用步骤
创建任务类,实现Job接口,类中写要执行的任务
public class Myjob implements Job{
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
for (int i = 1; i <= 7; i++) {
String s = "p"+i;
System.out.println((String) jec.getJobDetail().getJobDataMap().get(s));
}
}
}
在执行类中创建触发器对象,调度器对象,并设置执行时机,使用cron触发器需要只用cron表达式,可使用cron表达式在线生成器生成
public class Test {
public static void main(String[] args) {
dropHoliadays();
}
//简单触发器
static void simpleTrigger(){
try {
// 创建jobdetail对象,该对象关联任务类
JobDetail jobDetail = new JobDetail("myjob",Myjob.class);
// 为任务传递参数
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("p1", ". ▉▉▉ ▉▉▉ ");
jobDataMap.put("p2", ". ▉▉▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p3", ". ▉▉▉▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p4", ". ▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p5", ". ▉▉▉▉▉▉▉▉");
jobDataMap.put("p6", ". ▉▉▉▉▉");
jobDataMap.put("p7", ". ▉▉");
// 创建触发器对象
SimpleTrigger st = new SimpleTrigger("st1");
// 设置时间间隔
st.setRepeatInterval(3000);
// 设置开始时间
st.setStartTime(new Date(System.currentTimeMillis()+1000));
// 设置执行次数
st.setRepeatCount(-1);
// 创建调度工厂
SchedulerFactory sf = new StdSchedulerFactory();
// 获取触发
Scheduler scheduler = sf.getScheduler();
// 绑定触发器与任务
scheduler.scheduleJob(jobDetail, st);
// 启动调度执行
scheduler.start();
// 线程休眠
Thread.sleep(10000);
// 关闭调度
scheduler.shutdown();
} catch (Exception e) {
System.out.println("定时任务处理错误!!");
}
}
//复杂触发器
static void cron() {
try {
// 创建jobdetail对象,该对象关联任务类
JobDetail jobDetail = new JobDetail("myjob",Myjob.class);
// 为任务传递参数
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("p1", ". ▉▉▉ ▉▉▉ ");
jobDataMap.put("p2", ". ▉▉▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p3", ". ▉▉▉▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p4", ". ▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p5", ". ▉▉▉▉▉▉▉▉");
jobDataMap.put("p6", ". ▉▉▉▉▉");
jobDataMap.put("p7", ". ▉▉");
// 创建触发器对象
CronTrigger ct = new CronTrigger("ct1");
// 设置cron表达式,即执行规则
ct.setCronExpression("0,10,20,30 * * * * ?");
// 设置开始时间
ct.setStartTime(new Date(System.currentTimeMillis()+1000));
// 创建调度工厂
SchedulerFactory sf = new StdSchedulerFactory();
// 获取触发
Scheduler scheduler = sf.getScheduler();
// 绑定触发器与任务
scheduler.scheduleJob(jobDetail, ct);
// 启动调度执行
scheduler.start();
// 线程休眠
Thread.sleep(1000*60*2);
// 关闭调度
scheduler.shutdown();
} catch (Exception e) {
}
}
//指定cron触发器后剔除某些日期,精确到日,如国庆,元旦等
static void dropHoliadays() {
try {
// 创建jobdetail对象,该对象关联任务类
JobDetail jobDetail = new JobDetail("myjob",Myjob.class);
// 为任务传递参数
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("p1", ". ▉▉▉ ▉▉▉ ");
jobDataMap.put("p2", ". ▉▉▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p3", ". ▉▉▉▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p4", ". ▉▉▉▉▉▉▉▉▉▉▉");
jobDataMap.put("p5", ". ▉▉▉▉▉▉▉▉");
jobDataMap.put("p6", ". ▉▉▉▉▉");
jobDataMap.put("p7", ". ▉▉");
// 创建触发器对象
CronTrigger ct = new CronTrigger("ct1");
// 设置cron表达式,即执行规则
ct.setCronExpression("0-50 * * * * ?");
// 设置开始时间
ct.setStartTime(new Date(System.currentTimeMillis()+1000));
// 创建调度工厂
SchedulerFactory sf = new StdSchedulerFactory();
// 获取触发
Scheduler scheduler = sf.getScheduler();
//创建剔除元素对象
AnnualCalendar ac = new AnnualCalendar();
//创建指定日期对象
Calendar dropGuoQing = GregorianCalendar.getInstance();
//设置月份,从0开始计数,如10月,则写9
dropGuoQing.set(Calendar.MONTH, 11);
//设置日期,从1开始计数
dropGuoQing.set(Calendar.DATE, 22);
// 将日期绑定到剔除元素对象,true为剔除,false为包含
ac.setDayExcluded(dropGuoQing, true);
// 将节假日绑定到调度器,第一个为名字
scheduler.addCalendar("GuoQing", ac, true,true);
// 将剔除日期绑定到触发器
ct.setCalendarName("GuoQing");
// 绑定触发器与任务
scheduler.scheduleJob(jobDetail, ct);
// 启动调度执行
scheduler.start();
// 线程休眠
Thread.sleep(1000*60*3);
// 关闭调度
scheduler.shutdown();
} catch (Exception e) {
}
}
}