zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }
  • 相关阅读:
    关于Thread ThreadPool Parallel 的一些小测试demo
    VS附加到进程调试
    netcore 实现一个简单的Grpc 服务端和客户端
    CodeSmith 找不到请求的 .Net Framework Data Provider
    ocelot集成consul服务发现
    使用ocelot作为api网关
    关于add migration 报错的问题解决方案
    关于多线程efcore dbcontext 的解决方案。
    docker mysql 容器报too many connections 引发的liunx磁盘扩容操作
    关于liunx 机器脱机环境(netcore)Nuget包迁移的问题
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/11186399.html
Copyright © 2011-2022 走看看