• quartz2.3.0(四)JobDataMap—带状态集合的定时器内置集合


    任务类

    package org.quartz.examples.example4;
    
    import java.util.Date;
    
    import org.quartz.DisallowConcurrentExecution;
    import org.quartz.Job;
    import org.quartz.JobDataMap;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.quartz.JobKey;
    import org.quartz.PersistJobDataAfterExecution;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 任务job。这是一个接收参数并维护状态(前后任务可以共享数据)的简单作业
     */
    @PersistJobDataAfterExecution //持久化JobDataMap里的数据,使下一个定时任务还能获取到这些值
    @DisallowConcurrentExecution //禁止并发多任务执行,所以永远只有一个任务在执行中
    public class ColorJob implements Job {
    
        private static Logger _log = LoggerFactory.getLogger(ColorJob.class);
    
        // parameter names specific to this job
        public static final String FAVORITE_COLOR = "favorite color";
        public static final String EXECUTION_COUNT = "count";
    
        // 因为Quartz每次执行类时都会重新实例化该类,所以不能使用实例的非静态成员变量来维护状态!
        private int _counter = 1;
    
        // 必须要有public修饰的无参构造函数
        public ColorJob() {
        }
    
        /**
         *  这个执行方法会显示,放在JobDataMap里的数据在前后相关的任务中可以有数据状态(存在JobDataMap里)。
         *  而类的成员变量对象_counter却没有状态,每次都会被初始化为1.
         */
        public void execute(JobExecutionContext context) throws JobExecutionException {
    
            // 这个作业只是打印出它的作业名称以及它运行的日期和时间
            JobKey jobKey = context.getJobDetail().getKey();
    
            // 获取并打印传递的参数
            JobDataMap data = context.getJobDetail().getJobDataMap();
            String favoriteColor = data.getString(FAVORITE_COLOR);
            int count = data.getInt(EXECUTION_COUNT);
            _log.info("ColorJob: " + jobKey + " executing at " + new Date() + "
    " + "  favorite color is " + favoriteColor
                    + "
    " + "  execution count (from job map) is " + count + "
    "
                    + "  execution count (from job member variable) is " + _counter);
    
            // job执行计数器+1
            count++;
            data.put(EXECUTION_COUNT, count);
    
            // 增加局部成员变量
            // 这没有实际用途,因为作业状态不能通过成员变量维护!
            _counter++;
            try {
                Thread.sleep(60L * 1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }

    调度管理类

    package org.quartz.examples.example4;
    
    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;
    
    /**
     * 这个案例将演示如何将作业参数传递到作业中,以及如何维护状态
     */
    public class JobStateExample {
    
        public void run() throws Exception {
            Logger log = LoggerFactory.getLogger(JobStateExample.class);
    
            // 初始化一个调度工厂,并实例化一个调度类
            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, 10);
    
            // ========================================================
            // ============ job1 将运行五次,启动一次重复4次,每隔10秒执行一次
            // ========================================================
            JobDetail job1 = newJob(ColorJob.class).withIdentity("job1", "group1").build();
            SimpleTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();
            // 往job1的JobDataMap放入初始化数据
            job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");
            job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);
    
            // 调度任务运行
            Date scheduleTime1 = sched.scheduleJob(job1, trigger1);
            log.info(job1.getKey() + " will run at: " + scheduleTime1 + " and repeat: " + trigger1.getRepeatCount()
                    + " times, every " + trigger1.getRepeatInterval() / 1000 + " seconds");
    
            // ========================================================
            // ============ job2 将运行五次,启动一次重复4次,每隔10秒执行一次
            // ========================================================
            JobDetail job2 = newJob(ColorJob.class).withIdentity("job2", "group1").build();
            SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();
    
            // 往job2的JobDataMap放入初始化数据
            // 这个job任务喜欢的颜色是红色了!
            job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");
            job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);
    
            // 调度任务运行
            Date scheduleTime2 = sched.scheduleJob(job2, trigger2);
            log.info(job2.getKey().toString() + " will run at: " + scheduleTime2 + " and repeat: "
                    + trigger2.getRepeatCount() + " times, every " + trigger2.getRepeatInterval() / 1000 + " seconds");
    
            // 启动调度
            sched.start();
    
            try {
                Thread.sleep(10L * 1000L);   // 等待60秒
            } catch (Exception e) {
            }
            
            /**
             * 终止调度。
             * 但是如果当前仍然有任务正在运行中,则会等待该任务执行完毕再终止,期间debug信息会打印:
             * 21:48:54.965 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Waiting for thread TestScheduler_Worker-1 to shut down
             */
            sched.shutdown(true); //终止调度
    
            SchedulerMetaData metaData = sched.getMetaData();
            log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
    
        }
    
        public static void main(String[] args) throws Exception {
            JobStateExample example = new JobStateExample();
            example.run();
        }
    
    }
  • 相关阅读:
    洛谷P1328 生活大爆炸版石头剪刀布
    洛谷P1131 [ZJOI2007]时态同步
    洛谷P2585 [ZJOI2006]三色二叉树
    机器学习实战四(Logistic Regression)
    机器学习实战三(Naive Bayes)
    机器学习实战二 (Decision Tree)
    机器学习实战一(kNN)
    chapter9 拖放
    Stanford Algorithms(一): 大数相乘(c++版)
    读: 程序员之禅
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/11108035.html
Copyright © 2020-2023  润新知