Quartz入门实例7-处理被中断的Job
2014-07-31 20:11
302 查看
让Job实现
InterruptableJob就可以声明一个可被打断的Job,因为
InterruptableJob继承了Job接口 所以不用再继承Job接口
DumbInterruptableJob.java
InterruptExample.java
运行效果:
InterruptableJob就可以声明一个可被打断的Job,因为
InterruptableJob继承了Job接口 所以不用再继承Job接口
DumbInterruptableJob.java
package cn.zto.job; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.InterruptableJob; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.UnableToInterruptJobException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DumbInterruptableJob implements InterruptableJob { private boolean _interrupted = false; private JobKey _jobKey = null; public void execute(JobExecutionContext context) throws JobExecutionException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); this._jobKey = context.getJobDetail().getKey(); System.out.println("---- " +dateFormat.format(new Date()) +" : "+ this._jobKey + " 运行" ); try { for (int i = 0; i < 4; ++i) { try { Thread.sleep(1000L); } catch (Exception ignore) { ignore.printStackTrace(); } if (this._interrupted) { System.out.println("--- " + this._jobKey + " -- 被打断!"); return; } } } finally { System.out.println("---- " +dateFormat.format(new Date()) +" : "+ this._jobKey + " 执行结束 " ); } } public void interrupt() throws UnableToInterruptJobException { System.out.println("---" + this._jobKey + " -- 打断 --"); this._interrupted = true; } }
InterruptExample.java
package cn.zto.app; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.DateBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SchedulerMetaData; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.zto.job.DumbInterruptableJob; public class InterruptExample { public void run() throws Exception { System.out.println("------- 初始化 -------------------"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); System.out.println("------- 初始化完成 --------"); System.out.println("------- 向Scheduler加入Job ----------------"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); Date startTime = DateBuilder.nextGivenSecondDate(null, 15); JobDetail job = JobBuilder.newJob(DumbInterruptableJob.class) .withIdentity("interruptableJob1", "group1") .build(); SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()) .build(); Date ft = sched.scheduleJob(job, trigger); System.out.println(job.getKey() + " 将在: " + ft + " 时运行,重复: " + trigger.getRepeatCount() + " 次,每 " + trigger.getRepeatInterval() / 1000L + " 秒执行一次"); System.out.println("------- 开始Scheduler ----------------"); sched.start(); System.out.println("------- Scheduler调用job结束 -----------------"); System.out.println("------- 每7秒开始循环中断工作 ----------"); for (int i = 0; i < 50; ++i) { try { Thread.sleep(7000L); //请求中断,被中断的job必须是实现InterruptableJob接口 sched.interrupt(job.getKey()); } catch (Exception e) { } } System.out.println("------- 关闭Scheduler ---------------------"); sched.shutdown(true); System.out.println("------- 关闭完成 -----------------"); SchedulerMetaData metaData = sched.getMetaData(); System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); } public static void main(String[] args) throws Exception { InterruptExample example = new InterruptExample(); example.run(); } }
运行效果:
------- 初始化 ------------------- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. ------- 初始化完成 -------- ------- 向Scheduler加入Job ---------------- group1.interruptableJob1 将在: Thu Jul 31 20:15:30 CST 2014 时运行,重复: -1 次,每 5 秒执行一次 ------- 开始Scheduler ---------------- ------- Scheduler调用job结束 ----------------- ------- 每7秒开始循环中断工作 ---------- ---- 2014年07月31日 20时15分30秒 : group1.interruptableJob1 运行 ---- 2014年07月31日 20时15分34秒 : group1.interruptableJob1 执行结束 ---- 2014年07月31日 20时15分35秒 : group1.interruptableJob1 运行 ---group1.interruptableJob1 -- 打断 -- --- group1.interruptableJob1 -- 被打断! ---- 2014年07月31日 20时15分37秒 : group1.interruptableJob1 执行结束 ---- 2014年07月31日 20时15分40秒 : group1.interruptableJob1 运行 ---group1.interruptableJob1 -- 打断 -- --- group1.interruptableJob1 -- 被打断! ---- 2014年07月31日 20时15分44秒 : group1.interruptableJob1 执行结束 ---- 2014年07月31日 20时15分45秒 : group1.interruptableJob1 运行 ---- 2014年07月31日 20时15分49秒 : group1.interruptableJob1 执行结束 ---- 2014年07月31日 20时15分50秒 : group1.interruptableJob1 运行 ---group1.interruptableJob1 -- 打断 -- --- group1.interruptableJob1 -- 被打断! ---- 2014年07月31日 20时15分51秒 : group1.interruptableJob1 执行结束 ---- 2014年07月31日 20时15分55秒 : group1.interruptableJob1 运行 ---group1.interruptableJob1 -- 打断 -- --- group1.interruptableJob1 -- 被打断! ---- 2014年07月31日 20时15分58秒 : group1.interruptableJob1 执行结束 ---- 2014年07月31日 20时16分00秒 : group1.interruptableJob1 运行 ---- 2014年07月31日 20时16分04秒 : group1.interruptableJob1 执行结束 ------- 关闭Scheduler --------------------- ------- 关闭完成 ----------------- Executed 7 jobs.
相关文章推荐
- Quartz入门实例5-处理因执行job超时而错过触发的job
- Quartz入门实例6-处理job异常
- Quartz入门实例14-让Quartz的Job使用Spring注入的Bean
- Quartz入门实例4-通过JobDataMap实现数据的传输
- Quartz入门实例14-让Quartz的Job使用Spring注入的Bean
- (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail
- Quartz入门实例3-使用CronTrigger指定触发器执行job
- Quartz入门实例8-实现一个Job监听器
- Quartz入门实例9-实现Trigger监听器
- IOS处理音乐播放中断实例
- SCADA实例解析四--SCADA画图和图象处理 -- 入门一
- 企业级任务调度框架Quartz 四 多个job实例注册到任务调度器上
- Quartz 框架快速入门(二)--把JOB放入配置文件中
- 企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上
- Quartz入门实例2-根据SimpleScheduleBuilder配置不同的SimpleTrigger触发器
- 驱动开发入门之中断处理
- java中quartz 调度在一些定时任务(job)的入门级应用
- CE驱动开发入门之中断处理
- PhotoShop(PS)入门实例教程:照片后期调焦技巧处理手法
- 中断处理与【irqsoft】、【tasklet】和【work queue】使用实例