博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz入门实例7-处理被中断的Job
阅读量:2215 次
发布时间:2019-05-07

本文共 5560 字,大约阅读时间需要 18 分钟。

让Job实现

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 implementationSLF4J: 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.

转载地址:http://lhwfb.baihongyu.com/

你可能感兴趣的文章
分布式系统理论基础3: 时间、时钟和事件顺序
查看>>
分布式系统理论基础4:Paxos
查看>>
分布式系统理论基础5:选举、多数派和租约
查看>>
分布式系统理论基础6:Raft、Zab
查看>>
分布式系统理论进阶7:Paxos变种和优化
查看>>
分布式系统理论基础8:zookeeper分布式协调服务
查看>>
搞懂分布式技术1:分布式系统的一些基本概念
查看>>
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
查看>>
搞懂分布式技术3:初探分布式协调服务zookeeper
查看>>
搞懂分布式技术4:ZAB协议概述与选主流程详解
查看>>
搞懂分布式技术5:Zookeeper的配置与集群管理实战
查看>>
搞懂分布式技术6:Zookeeper典型应用场景及实践
查看>>
搞懂分布式技术10:LVS实现负载均衡的原理与实践
查看>>
搞懂分布式技术11:分布式session解决方案与一致性hash
查看>>
搞懂分布式技术12:分布式ID生成方案
查看>>
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>
搞懂分布式技术16:浅谈分布式锁的几种方案
查看>>
搞懂分布式技术17:浅析分布式事务
查看>>