文章目录

  • 概述
  • 示例
  • 示例源码

概述

由于业务需要,停止Quartz中正在执行的任务

  1. 任务类只需要实现InterruptableJob类,然后实现interrupt()方法。

  2. 在这个方法中进行标记的改变,在执行中进行这个标记判断,就可实现中断任务了

  3. 另外在调度器上调用方法:sched.interrupt(job.getKey())


示例

job类

package com.xgj.quartz.quartzItself.interruptableJob;import java.text.SimpleDateFormat;
import java.util.Date;import org.quartz.InterruptableJob;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.UnableToInterruptJobException;/*** * * @ClassName: DumbInterruptableJob* * @Description: 个可执行的中断可执行程序,用于单元测试。* * @author: Mr.Yang* * @date: 2017年11月15日 上午9:26:36*/public class DumbInterruptableJob implements InterruptableJob {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private boolean _interrupted = false; // job 是否中断private JobKey _jobKey = null; // job nameprivate static int counts = 0; // 中断执行次数@Overridepublic void execute(JobExecutionContext context)throws JobExecutionException {_jobKey = context.getJobDetail().getKey();System.out.println("【开始执行】任务Key:" + _jobKey + ",执行时间: "+ sdf.format(new Date()));try {for (int i = 0; i < 4; i++) {try {Thread.sleep(1000L);} catch (Exception e) {e.printStackTrace();}// 查看是否中断if (_interrupted) {counts++;System.out.println("被外界因素停止了这个任务key:" + _jobKey+ ",中断累计次数: " + counts + "\n");return; // 也可以选择抛出一个JobExecutionException,根据业务需要指定行为}}} finally {System.out.println("【完成任务】key:" + _jobKey + " 完成时间:"+ sdf.format(new Date()));}}@Overridepublic void interrupt() throws UnableToInterruptJobException {System.out.println("\n—————— 【中断】外界正在调用调度器停止这个任务key:" + _jobKey+ " ————————");_interrupted = true;}}

调度类

package com.xgj.quartz.quartzItself.interruptableJob;import static org.quartz.DateBuilder.nextGivenSecondDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;import java.text.SimpleDateFormat;
import java.util.Date;import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;/*** * * @ClassName: InterruptExample* * @Description: 调度类* * @author: Mr.Yang* * @date: 2017年11月15日 上午9:28:21*/public class InterruptExample {public void run() throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("------- 初始化 ----------------------");SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();// 下一个15秒Date startTime = nextGivenSecondDate(null, 15);// 当前时间15秒后,每间隔5秒执行一次任务JobDetail job = newJob(DumbInterruptableJob.class).withIdentity("interruptableJob1", "group1").build();SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(startTime).withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();Date ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey() + " 将运行于:" + sdf.format(ft) + " 并重复:"+ trigger.getRepeatCount() + " 次,间隔 "+ trigger.getRepeatInterval() / 1000 + " 秒");// 调度开始执行sched.start();System.out.println("------- 开始调度 (调用.start()方法) ----------------");System.out.println("------- 每7秒钟启动一次中断任务(10次中断) ----------");for (int i = 0; i < 10; i++) {try {Thread.sleep(7000L);// 手动中断调度器中的jobsched.interrupt(job.getKey());} catch (Exception e) {e.printStackTrace();}}System.out.println("------- 关闭调度 ---------------------");sched.shutdown(true);System.out.println("------- 关闭调度器完成 -----------------");SchedulerMetaData metaData = sched.getMetaData();System.out.println("~~~~~~~~~~  执行了 "+ metaData.getNumberOfJobsExecuted() + " 个 jobs.");}public static void main(String[] args) throws Exception {InterruptExample example = new InterruptExample();example.run();}
}

运行结果

------- 初始化 ----------------------
INFO  StdSchedulerFactory - Using default implementation for ThreadExecutor
INFO  SimpleThreadPool - Job execution threads will use class loader of thread: main
INFO  SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO  QuartzScheduler - Quartz Scheduler v.2.2.3 created.
INFO  RAMJobStore - RAMJobStore initialized.
INFO  QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO  StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
INFO  StdSchedulerFactory - Quartz scheduler version: 2.2.3
group1.interruptableJob1 将运行于:2017-11-15 09:29:45 并重复:-1 次,间隔 5 秒
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
------- 开始调度 (调用.start()方法) ----------------
------- 每7秒钟启动一次中断任务(10次中断) ----------
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:29:45—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 1【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:29:49
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:29:50
【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:29:54
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:29:55—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 2【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:29:56
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:00—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 3【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:03
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:05
【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:09
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:10
【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:14
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:15—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 4【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:17
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:20—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 5【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:24
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:25
【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:29
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:30—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 6【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:31
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:35—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 7【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:38
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:40
【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:44
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:45
【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:49
【开始执行】任务Key:group1.interruptableJob1,执行时间: 2017-11-15 09:30:50—————— 【中断】外界正在调用调度器停止这个任务key:group1.interruptableJob1 ————————
------- 关闭调度 ---------------------
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
被外界因素停止了这个任务key:group1.interruptableJob1,中断累计次数: 8【完成任务】key:group1.interruptableJob1 完成时间:2017-11-15 09:30:52
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
------- 关闭调度器完成 -----------------
~~~~~~~~~~  执行了 14 个 jobs.

示例源码

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

Quartz-中断正在执行的任务相关推荐

  1. Spring的quartz定时器重复执行二次的问题解决

    Spring的quartz定时器重复执行二次的问题解决 参考文章: (1)Spring的quartz定时器重复执行二次的问题解决 (2)https://www.cnblogs.com/alamps/p ...

  2. 设备驱动--中断开关执行的匹配

    近期项目生产过程中出现概率为万分之几异常,此中异常实在是折磨人啊!连续几天的熬夜复现分析,总算是找到异常原因:为加强自己对问题的认知特编辑此文对问题做进一步梳理. 1 问题现象 开机偶见TP失效: 2 ...

  3. JavaScript如何中断循环执行?

    我们在开发过程中经常会需要将我们设置好的语句根据一定的规则中断执行,这样才能完成功能,那么你知道都有哪些方式能够实现这个效果吗? 方法一:break 方法二:return 方法三:continue 方 ...

  4. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...

  5. quartz 两次执行问题

    最近发现网站(xiayule.net)越写越大,有些东西已经难以维护了,想要添加个功能,都得斟酌半天 项目中有很多可重构的地方,小重构一直进行,大的不敢动,毕竟没有很多时间做测试. 最后,决定精简代码 ...

  6. quartz定时任务不执行

    quartz定时任务执行一段时间不执行的原因 数据库表QRTZ_TRIGGERS 里的TRIGGER_STATE 字段的值自动修改为ERROR了 ,quartz定时任务是不扫描这种ERROR情况. 之 ...

  7. 中断服务程序执行顺序

    单级中断系统中,中断服务程序执行顺序: ①保护现场 ②中断事件处理 ③恢复现场 ④开中断 ⑤中断返回

  8. linux 的中断 命令,linux skill命令参数及用法详解(linux中断进程执行命令)

    linux skill命令参数及用法详解(linux中断进程执行命令) 发布时间:2012-07-21 12:09:37   作者:佚名   我要评论 linux 冻结进程命令 skill 使用详解 ...

  9. 可以在中断服务程序执行malloc吗?

    这是微信群里面的一个群友提的问题,原问题如下: 今天遇到一个面试问题  请教各位老哥  中断服务程序能否malloc ?为什么?我回答是 不行 因为中断服务程序应该要尽量简短,且执行完中断服务程序会跳 ...

  10. js 中断函数执行_js如何中断递归函数

    如题,功能是为了生成一个多级数组内的某个id及他的父元素的id数组,但是在查询完毕以后retrun出生成的数组结果,依然还执行了剩下的循环,请问要如何中断并跳出呢 initArr = (id, typ ...

最新文章

  1. 解压Ubuntu的initrd.img的方法
  2. 百度如何能实时检索到15分钟前新生成的网页?--转
  3. ORACLE SQL笛卡尔集
  4. java中的jdk切换(无需卸载原有jdk)
  5. 经典面试题 之 子数组之和最大值
  6. RocketMQ 常见面试题
  7. [翻译] PPDragDropBadgeView
  8. elcipse 编译cocos2d-x android
  9. python深度学习图像处理CSV文件分类标签图片到各个文件夹
  10. 计算机中丢失vulkan-1.dll,vulkan-1.dll
  11. IK(反向动力学)简单原理与实现
  12. 基于组态软件的35kV变电站监控系统设计简介
  13. 2021年南京市高考成绩查询,2021年南京高考各高中成绩及本科升学率数据排名及分析...
  14. 计算机如何更改扩展名,文件扩展名怎么改,怎样更改文件的扩展名
  15. 无人驾驶学习介绍和感悟
  16. SSM整合之CRUD增删改查案例(非ajax版)
  17. QQ邮箱设置企业邮箱别名邮箱
  18. three.js轨道控制器OrbitControls.js
  19. 网格搜索自动化_使用GridGuide自动化您的网格设计过程
  20. HTTP/2 Server Push 详解

热门文章

  1. 结构指针的坑之(定义结构体指针时并没有分配存储空间,所以要用malloc()申请空间)
  2. sql OFFSET 和 ORDINAL
  3. c语言编写程序x的y次方,C语言变为编程y = x-x立方/ 3! + x五次方力量/ 5! -x7th power / 7!...
  4. 不用任何比较判断找出两个数中较大的数
  5. 什么是pretext tasks?
  6. MATLAB应用实战系列( 七十五) -图像处理应用 MATLAB实现基于分水岭算法的图像分割 (附matlab代码)
  7. tableau必知必会之如何在同一视图中进行相同分析维度图表的切换
  8. mysql查看比较大的数据表_mysql 如何查看哪些表数据量比较大
  9. Python编程基础:第二十五节 args参数*args
  10. ARCGIS导入XY坐标的EXCEL文档,出现无法选择X和Y字段的问题