Quartz-中断正在执行的任务
生活随笔
收集整理的這篇文章主要介紹了
Quartz-中断正在执行的任务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 概述
- 示例
- 示例源碼
概述
由于業務需要,停止Quartz中正在執行的任務
任務類只需要實現InterruptableJob類,然后實現interrupt()方法。
在這個方法中進行標記的改變,在執行中進行這個標記判斷,就可實現中斷任務了
另外在調度器上調用方法: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-中断正在执行的任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz-异常处理
- 下一篇: Quartz-Cron表达式统计最近几次