quartz2.3.0(七)调度器中断任务执行,手动处理任务中断事件
job任务类
package org.quartz.examples.example7; import java.util.Date; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.InterruptableJob;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.UnableToInterruptJobException; /**
* 一个可中断作业的愚蠢实现,用于单元测试。
*/
public class DumbInterruptableJob implements InterruptableJob { private static Logger LOG = LoggerFactory.getLogger(DumbInterruptableJob.class); // 任务是否被打断标记
private boolean _interrupted = false; // job name
private JobKey _jobKey = null; // 必须要有public修饰的无参构造函数
public DumbInterruptableJob() {
} // 定时器执行方法
public void execute(JobExecutionContext context) throws JobExecutionException { _jobKey = context.getJobDetail().getKey();
LOG.info("---- " + _jobKey + " executing at " + new Date() + ", _interrupted = " + _interrupted); try {
// main job loop... see the JavaDOC for InterruptableJob for discussion...
// do some work... in this example we are 'simulating' work by sleeping... :) for (int i = 0; i < 4; i++) {
try {
Thread.sleep(1000L);
} catch (Exception ignore) {
ignore.printStackTrace();
}
LOG.info("---- job任务for循环["+i+"], _interrupted = " + _interrupted);
// 定期检查我们是否被中断了,在这里可以手动处理我们的业务逻辑
if (_interrupted) {
LOG.info("--- " + _jobKey + " -- 打断……救助!!!");
return; // 如果抛出JobExecutionException是基于特定工作的职责/行为的,那么还可以选择抛出它吗
}
} } finally {
LOG.info("---- " + _jobKey + " completed at " + new Date());
}
} //重写任务的被中断方法,手动处理中断事件
@Override
public void interrupt() throws UnableToInterruptJobException {
LOG.info("---" + _jobKey + " -- INTERRUPTING --");
_interrupted = true;
} }
调度器类
package org.quartz.examples.example7; 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 org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.Date; /**
* 演示调度器中断job任务
*/
public class InterruptExample { public void run() throws Exception {
final Logger log = LoggerFactory.getLogger(InterruptExample.class); log.info("------- Initializing ----------------------"); // First we must get a reference to a scheduler
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler(); // 第一个参数:null就是默认当前时间,也可以指定时间
// 第二个参数:把一分钟按30进行划分,也就是60/30等份。
// 举例:当前时间是21:01:27,那么startTime就是21:01:30。当前时间是21:01:32,那么startTime就是21:02:00。
Date startTime = nextGivenSecondDate(null, 15);
JobDetail job = newJob(DumbInterruptableJob.class).withIdentity("interruptableJob1", "group1").build(); // 间隔5秒,无限循环
SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
Date ft = sched.scheduleJob(job, trigger);
log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); sched.start(); log.info("------- 每7秒就中断一次job任务,循环50次 ----------");
for (int i = 0; i < 50; i++) {
Thread.sleep(7000L);
log.info("------- 每7秒就中断一次job任务,循环:" + i);
sched.interrupt(job.getKey()); //调度器可以直接中断某个任务
} log.info("------- Shutting Down ---------------------");
sched.shutdown(true); log.info("------- Shutdown Complete -----------------");
SchedulerMetaData metaData = sched.getMetaData();
log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); } public static void main(String[] args) throws Exception { InterruptExample example = new InterruptExample();
example.run();
} }
quartz2.3.0(七)调度器中断任务执行,手动处理任务中断事件的更多相关文章
- cocos2d调度器(定时执行某函数)
调度器(scheduler) 继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或 ...
- quartz2.3.0(十三)数据库持久化定时器job任务和trigger触发器,在多个调度器实例情况下,由其它调度器实例恢复执行调度器宕机的job任务
一.初始化数据库11张quartz表:qrtz_* 先从官网下载好quartz2.3.0包:http://www.quartz-scheduler.org/downloads/ 解压后进入目录:q ...
- quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0
quartz2.3.0系列目录 官网下载地址:http://www.quartz-scheduler.org/downloads/ 本系列demo全部来源于官网,仅仅是简化和汉化了注释!一部分代码de ...
- Erlang调度器细节探析
Erlang调度器细节探析 Erlang的很多基础特性使得它成为一个软实时的平台.其中包括垃圾回收机制,详细内容可以参见我的上一篇文章Erlang Garbage Collection Details ...
- 调度器简介,以及Linux的调度策略
进程是操作系统虚拟出来的概念,用来组织计算机中的任务.但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失.不过,进程的生命都得到了操作系统内核的关照.就 ...
- Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)
主调度器 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_N ...
- FreeRTOS 任务与调度器(1)
前言: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容FreeRTOS文件如下: Task.c和Task.h文件内是F ...
- CFS调度器
一.前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了.这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭.我有一个循序渐进的方法,那就是先 ...
- Linux 调度器发展简述
引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的 ...
随机推荐
- 洛谷 P1522 牛的旅行 Cow Tours 题解
P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...
- 如何防范web前端安全攻击
一.对于XSS防御: 1.不要信任任何外部传入的数据,针对用户输入作相关的格式检查.过滤等操作,以及转义字符处理.最普遍的做法就是转义输入输出的内容,对于括号,尖括号,斜杠进行转义 function ...
- 【NOIP2017模拟测试(10-28)】平衡树
平衡树解题报告 Description 小D最近又在种树,可是他的种树技巧还是很差,种出的树都长的歪七扭八,为了让树变得平衡一些,小D决定从树上删掉一条边,然后再加上一条边,使得到的仍然是一棵树并且这 ...
- 把pdf的内容转化为txt文件
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.util.PDFTextStripper; import j ...
- 【大数据应用技术】作业十二|Hadoop综合大作业
本次作业的要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 前言 本次作业是在<爬虫大作业>的基础上进行的 ...
- Linux /var/log下各种日志文件
Linux /var/log下各种日志文件:
- 网易云音乐MP3外链地址
网易云音乐MP3外链地址下载方法很简单的方法: 下载公式:http://music.163.com/song/media/outer/url?id=ID数字.mp3 把上面红色部分(ID数字)换成 ...
- golang rabbitmq 的学习
https://www.rabbitmq.com/tutorials/tutorial-one-go.html Rabbitmq的任务分发机制 producer_task.go package mai ...
- jsoup获取标签下的文本(去除子标签的)
jsoup获取标签下的文本(去除子标签的) <pre name="code" class="java">Element content=doc.se ...
- PLSQL查询执行计划
转: PLSQL查询执行计划 01(转) 2019-05-15 15:15:43 p享自由q 阅读数 365 一般优化途径: 如果能通过修改语句优化,比如查询条件或执行顺序,sql改不了,可以通过 ...