下载代码直接看结果先 去论坛下载代码http://bbs.zbaccp.com/viewthread.php?tid=7281&extra=page%3D1&frombbs=1
如果对前面的代码你的理解还有些模糊,下面我们来具体研究2个类:
JobDetail
public JobDetail(String name,//作业名
String group,//组名
Class jobClass,//执行哪个作业
)
SimpleTrigger
public SimpleTrigger(String name,//触发器名称
String group,//触发器所在组
String jobName,//作业名
String jobGroup,//作业所在组
Date startTime,//触发器触发时间
Date endTime,//触发器退出时间
int repeatCount,//触发器反复出发次数,REPEAT_INDEFINITELY是无限循环
long repeatInterval//每次触发的时间间隔(毫秒计)
)
1.看第一个例子部分代码:
// 所有的作业都可以在sched.start()被调用前调度
// 获取下个15秒的开始,如当前是10秒,则在15秒执行,如实16秒,则在30秒执行
// 如果不喜欢这个方法,自己定义一个Date也可以
long ts = TriggerUtils.getNextGivenSecondDate(null, 15).getTime();
// 作业3 将执行11次(运行1次然后重复多次)
// 作业3 将每10秒执行一次(1000毫秒)
JobDetail job = new JobDetail("作业3", "组1", SimpleJob.class);//定义作业
SimpleTrigger trigger = new SimpleTrigger("触发器3", "组1", "作业3", "组1",
new Date(ts), null, 10, 10000L);//定义触发器,在ts这个时间执行一次,然后每10秒执行一次,共11次
Date ft = sched.scheduleJob(job, trigger);//将作业加入调度队列,等待调度启动
log.info(job.getFullName() +
" 将在时间: " + ft +
" 执行 并重复执行: " + trigger.getRepeatCount() +
" 次, 每次间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
// 还是刚才那个作业3,同样的作业将被另外一个触发器调度
// 这次每70秒调度一次
trigger = new SimpleTrigger("作业3", "组2", "作业3", "组1",
new Date(ts), null, 2, 70000L);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() +
" 将在时间: " + ft +
" 执行 并重复执行: " + trigger.getRepeatCount() +
" 次, 每次间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
log.info("------- 启动调度器 ----------------");
sched.start();//调度器启动作业,相当于神舟7号准备就绪了,具体什么时候飞天,还得看何时点火
2.看第二个例子部分代码
// 所有的作业都可以在sched.start()被调用前调度
// 获取下个15秒的开始,如当前是10秒,则在15秒执行,如实16秒,则在30秒执行
// 如果不喜欢这个方法,自己定义一个Date也可以
long ts = TriggerUtils.getNextGivenSecondDate(null, 15).getTime();
// 作业4 将执行6次(运行1次然后反复执行5次)
// 作业4 每10秒执行1次(1000毫秒)
JobDetail job = new JobDetail("作业4", "组1", SimpleJob.class);
SimpleTrigger trigger = new SimpleTrigger("触发器4", "组1", "作业4", "组1",
new Date(ts), null, 5, 10000L);
Date ft = sched.scheduleJob(job, trigger);
log.info(job.getFullName() +
" 将在时间: " + ft +
" 执行 并重复执行: " + trigger.getRepeatCount() +
" 次, 每次间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
// 作业5 将执行1次,在"ts"这个时间后1分钟执行(60秒之后)
job = new JobDetail("作业5", "组1", SimpleJob.class);
trigger = new SimpleTrigger("触发器5", "组1", "作业5", "组1",
new Date(ts + 60000), null, 0, 0);
ft = sched.scheduleJob(job, trigger);
log.info(job.getFullName() +
" 将在时间: " + ft +
" 执行 并重复执行: " + trigger.getRepeatCount() +
" 次, 每次间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
// 作业6 将每50秒执行一次
job = new JobDetail("作业6", "组1", SimpleJob.class);
trigger = new SimpleTrigger("触发器6", "组1", "作业6", "组1",
new Date(ts), null, SimpleTrigger.REPEAT_INDEFINITELY, 50000L);
ft = sched.scheduleJob(job, trigger);
log.info(job.getFullName() +
" 将在时间: " + ft +
" 执行 并重复执行: " + trigger.getRepeatCount() +
" 次, 每次间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
log.info("------- 启动调度器 ----------------");
sched.start();//调度器启动作业,相当于神舟7号准备就绪了,具体什么时候飞天,还得看何时点火
3.看第三个例子部分代码,之前的代码都是在start()方法调用前就已经作业准备就绪,这个不一样,start()调用后依然可以加入新的作业,已经调度好的作业也可以修改。
// 所有的作业都可以在sched.start()被调用前调度
// 获取下个15秒的开始,如当前是10秒,则在15秒执行,如实16秒,则在30秒执行
// 如果不喜欢这个方法,自己定义一个Date也可以
long ts = TriggerUtils.getNextGivenSecondDate(null, 15).getTime();
log.info("------- 启动调度器 ----------------");
sched.start();//调度器启动作业,相当于神舟7号准备就绪了,具体什么时候飞天,还得看何时点火
// 作业也可以在start() 方法被调用后加入调度队列
// 作业7将会重复20次,每次间隔1分钟
JobDetail job = new JobDetail("作业7", "组1", SimpleJob.class);
SimpleTrigger trigger = new SimpleTrigger("触发器7", "组1", "作业7", "组1",
new Date(ts), null, 20, 60*1000L);
Date ft = sched.scheduleJob(job, trigger);
log.info(job.getFullName() +
" 将在时间: " + ft +
" 执行 并重复执行: " + trigger.getRepeatCount() +
" 次, 每次间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
// 作业也可以直接被触发调用,不必设置专门的触发器调用
job = new JobDetail("作业8", "组1", SimpleJob.class);
job.setDurability(true);
sched.addJob(job, true);
log.info("’人工’ 触发 作业8...");
sched.triggerJob("作业8", "组1");
log.info("------- 等待 30 秒... --------------");
try {
// 等待30秒看结果
Thread.sleep(30L * 1000L);
// 执行...
} catch (Exception e) {
}
// 作业可以被重新设置调度的时间及调度形式,前面的设置失效
// 作业7将立即执行并每秒1次反复执行10次
log.info("------- 调度开始... --------------------");
trigger = new SimpleTrigger("触发器7", "组1", "作业7", "组1",
new Date(), null, 10, 1000L);
ft = sched.rescheduleJob("触发器7", "组1", trigger);
log.info("作业7将在时间: " + ft+" 执行");
log.info("------- 等待5分钟... ------------");
try {
// 等待5分钟来看作业执行
Thread.sleep(1000*60*5);
// 执行中...
} catch (Exception e) {
}
log.info("------- 关闭调度器 ---------------------");