zoukankan      html  css  js  c++  java
  • quartz2.3.0(二)触发器Trigger花式Scheduler调度job

    任务类

     1 package org.quartz.examples.example2;
     2 
     3 import java.util.Date;
     4 
     5 import org.slf4j.Logger;
     6 import org.slf4j.LoggerFactory;
     7 import org.quartz.Job;
     8 import org.quartz.JobExecutionContext;
     9 import org.quartz.JobExecutionException;
    10 import org.quartz.JobKey;
    11 
    12 /**
    13  * 任务job
    14  */
    15 public class SimpleJob implements Job {
    16 
    17     private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);
    18 
    19     // 必须要有public修饰的无参构造函数
    20     public SimpleJob() {
    21     }
    22 
    23     // 任务执行方法
    24     public void execute(JobExecutionContext context) throws JobExecutionException {
    25         JobKey jobKey = context.getJobDetail().getKey();  //jobKey长这样:group1.job6
    26         LOG.info("执行任务。SimpleJob says: " + jobKey + " executing at " + new Date());
    27     }
    28 
    29 }

    调度管理类

    package org.quartz.examples.example2;
    
    import static org.quartz.DateBuilder.futureDate;
    import static org.quartz.JobBuilder.newJob;
    import static org.quartz.JobKey.jobKey;
    import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
    import static org.quartz.TriggerBuilder.newTrigger;
    
    import org.quartz.DateBuilder;
    import org.quartz.DateBuilder.IntervalUnit;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    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 SimpleTriggerExample {
        Logger LOG = LoggerFactory.getLogger(SimpleTriggerExample.class);
    
        public void run() throws Exception {
    
            // 初始化一个调度工厂,并实例化一个调度类
            SchedulerFactory sf = new StdSchedulerFactory();
            Scheduler scheduler = sf.getScheduler();
            // 第一个参数:null就是默认当前时间,也可以指定时间
            // 第二个参数:把一分钟按15进行划分,也就是60/15等份。
            // 举例:当前时间是10:26:04,那么startTime就是10:26:15。当前时间是10:26:31,那么startTime就是10:26:45。
            Date startTime = DateBuilder.nextGivenSecondDate(null, 15);
    
            // ========================================================
            // ============ job1 任务绑定到group1 组中 ==================
            // ========================================================
            JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();
            // 实例化一个触发器,命名为trigger1,并绑定到一个名为group1的组中,Job类运行开始时间为runTime(下一分钟)
            SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
                    .build();
            Date date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ========================================================
            // ============ job2 任务绑定到group1 组中 ==================
            // ========================================================
            job = newJob(SimpleJob.class).withIdentity("job2", "group1").build();
            trigger = (SimpleTrigger) newTrigger().withIdentity("trigger2", "group1").startAt(startTime).build();
            date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ====================================================================
            // ============ job3 任务绑定到group1 组中,运行一次每间隔10秒重复1次,总共重复10次
            // ====================================================================
            job = newJob(SimpleJob.class).withIdentity("job3", "group1").build();
            trigger = newTrigger().withIdentity("trigger3", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
            date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
            // ====================================================================
            // ============ job3 任务绑定到group2 组中,将被另一个触发器调度,这一次将以70秒的间隔重复两次
            // ====================================================================
            trigger = newTrigger().withIdentity("trigger3", "group2").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build();
    
            date = scheduler.scheduleJob(trigger);
            LOG.info(job.getKey() + " will [also] run at: " + date + " and repeat: " + trigger.getRepeatCount()
                    + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ====================================================================
            // ============ job4 将被执行6次,执行一次重复5次,每次间隔10秒
            // ====================================================================
            job = newJob(SimpleJob.class).withIdentity("job4", "group1").build();
            trigger = newTrigger().withIdentity("trigger4", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build();
            date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ====================================================================
            // ============ job5 将在5分钟后执行一次
            // ====================================================================
            job = newJob(SimpleJob.class).withIdentity("job5", "group1").build();
            trigger = (SimpleTrigger) newTrigger().withIdentity("trigger5", "group1")
                    .startAt(futureDate(5, IntervalUnit.MINUTE)).build();
            date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ====================================================================
            // ============ job6 将被无限期地执行,每隔40秒执行一次
            // ====================================================================
            job = newJob(SimpleJob.class).withIdentity("job6", "group1").build();
            trigger = newTrigger().withIdentity("trigger6", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
            date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ====================================================================
            // ============ 启动调度器
            // ====================================================================
            scheduler.start();
    
            // ====================================================================
            // ============ 在调度器启动之后,新增加的job7仍将可以被调度,job7将5分钟执行一次,总共重复20次
            // ====================================================================
            job = newJob(SimpleJob.class).withIdentity("job7", "group1").build();
            trigger = newTrigger().withIdentity("trigger7", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build();
            date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
    
            // ====================================================================
            // ============ job8绑定到group1,只有定义好触发器,才会被执行
            // ====================================================================
            job = newJob(SimpleJob.class).withIdentity("job8", "group1").storeDurably().build();
            scheduler.addJob(job, true); // job添加到任务调度器
            scheduler.triggerJob(jobKey("job8", "group1")); // 手动触发job8,绑定到group1
    
            try {
                Thread.sleep(30L * 1000L); // 等待30秒,让任务都执行完毕
            } catch (Exception e) {
            }
    
            /**
             * 终止调度。
             * 但是如果当前仍然有任务正在运行中,则会等待该任务执行完毕再终止,期间debug信息会打印:
             * 21:48:54.965 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Waiting for thread TestScheduler_Worker-1 to shut down
             */
            scheduler.shutdown(true);
    
            // 显示调度器的一些统计信息
            SchedulerMetaData metaData = scheduler.getMetaData();
            LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
    
        }
    
        // 演示触发器被重新调度案例
        private void rescheduleJobDemo() throws SchedulerException {
            // 初始化一个调度工厂,并实例化一个调度类
            SchedulerFactory sf = new StdSchedulerFactory();
            Scheduler scheduler = sf.getScheduler();
            // 第一个参数:null就是默认当前时间,也可以指定时间
            // 第二个参数:把一分钟按30进行划分,也就是60/30等份。
            // 举例:当前时间是21:01:27,那么startTime就是21:01:30。当前时间是21:01:32,那么startTime就是21:02:00。
            Date startTime = DateBuilder.nextGivenSecondDate(null, 15);
    
            // ====================================================================
            // ============ job600 将被无限期地执行,每隔5秒执行一次,由trigger2019触发
            // ====================================================================
            JobDetail job = newJob(SimpleJob.class).withIdentity("job600", "group1").build();
            SimpleTrigger trigger = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
            Date date = scheduler.scheduleJob(job, trigger);
            LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                    + trigger.getRepeatInterval() / 1000 + " seconds");
            // ====================================================================
            // ============ 启动调度器
            // ====================================================================
            scheduler.start();
    
            try {
                System.out.println("线程进入睡眠");
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程被唤醒");
            // ====================================================================
            // ============ job600 被重新定义的trigger2019触发器重新调度,改为每1秒钟执行一次
            // ====================================================================
            SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime)
                    .withSchedule(simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();
            Date date2 = scheduler.rescheduleJob(trigger2.getKey(), trigger2);
            LOG.info("job600 rescheduled to run at: " + date2);
        }
    
        public static void main(String[] args) throws Exception {
            SimpleTriggerExample example = new SimpleTriggerExample();
            example.run();
            example.rescheduleJobDemo(); // 重新调度案例
        }
    
    }
  • 相关阅读:
    golang之panic,recover,defer
    Golang之函数练习
    Golang之strings包
    Golang之字符串操作(反转中英文字符串)
    keil中使用——变参数宏__VA_ARGS__
    到底该不该用RTOS——rtos的优点
    c语言联合union的使用用途
    c语言的#和##的用法
    c语言位域的使用注意事项——数据溢出
    基于 Keil MDK 移植 RT-Thread Nano
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/11074433.html
Copyright © 2011-2022 走看看