• Quartz深入浅出(二)


    Hello Quartz / 本文通过一个简单的样例让大家高速了解Quartz,上手。并了解Quartz内的一些关键对象 如 Scheduler、Job、Trigger、JobExecutionContext等对象
    1. 导入Quartz所需的两个jar包 <quartz-2.2.1.jarr、quartz-jobs-2.2.1.jar>
      1. 创建我们自己的Job类 HelloJob,进行简单的输出
      2. package org.quartz.examples.examples01;
        
        import java.util.Date;
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        import org.quartz.Job;
        import org.quartz.JobExecutionContext;
        import org.quartz.JobExecutionException;
        
        /**
         * hello world Quartz
         * @author weeks
         *
         */
        public class HelloJob implements Job {
        
            private static Logger _log = LoggerFactory.getLogger(HelloJob .class );
        
            /**
             * Job,Job须要一个公有的构造函数。否则Factory无法构建
             */
            public HelloJob() {
            }
        
            /**
             * 实现execute方法
             */
            public void execute(JobExecutionContext context)
                throws JobExecutionException {
                _log.info( "Hello World! - " + new Date());
            }
        
        }
      3. 创建我们的Job执行样例,在下一分钟执行我们自己Job
      4. package org.quartz.examples.examples01;
        
        import static org.quartz.DateBuilder.evenMinuteDate ;
        import static org.quartz.JobBuilder.newJob ;
        import static org.quartz.TriggerBuilder.newTrigger ;
        import org.quartz.JobDetail;
        import org.quartz.Scheduler;
        import org.quartz.SchedulerFactory;
        import org.quartz.Trigger;
        import org.quartz.impl.StdSchedulerFactory;
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        import java.util.Date;
        
        /**
         * 此Demo将演示怎样启动和关闭Quartz调度器。以及怎样运作
         * @author weeks
         *
         */
        public class SimpleExample {
        
          public void run() throws Exception {
            Logger log = LoggerFactory.getLogger(SimpleExample.class);
        
            log.info("------- Initializing ----------------------");
        
            // 1、工厂模式 构建Scheduler的Factory。当中STD为Quartz默认的Factory,开发人员亦可自行实现自己的Factory;Job、Trigger等组件
            SchedulerFactory sf = new StdSchedulerFactory();
            // 2、通过SchedulerFactory获得Scheduler对象
            Scheduler sched = sf.getScheduler();
        
            log.info("------- Initialization Complete -----------");
        
            // 3、org.quartz.DateBuilder.evenMinuteDate <下一分钟>  -- 通过DateBuilder构建Date
            Date runTime = evenMinuteDate(new Date());
        
            log.info("------- Scheduling Job  -------------------");
        
            // 4、org.quartz.JobBuilder.newJob --通过JobBuilder构建Job
            JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
        
            // 5、通过TriggerBuilder进行构建
            Trigger trigger = newTrigger().withIdentity("trigger1" , "group1").startAt(runTime ).build();
        
            // 6、工厂模式。组装各个组件<JOB,Trigger>
            sched.scheduleJob(job, trigger);
           
            // [group1.job1] will run at:
            log.info(job.getKey() + " will run at: " + runTime);
        
            // 7、start
            sched.start();
        
            log.info("------- Started Scheduler -----------------");
        
            log.info("------- Waiting 65 seconds... -------------");
            try {
              // wait 65 seconds to show job
              Thread.sleep(65L * 1000L);
              // executing...
            } catch (Exception e) {
              //
            }
        
            // shut down the scheduler
            log.info("------- Shutting Down ---------------------");
            // 8、通过Scheduler销毁内置的Trigger和Job
            sched.shutdown(true);
            log.info("------- Shutdown Complete -----------------");
          }
        
          public static void main(String[] args) throws Exception {
        
            SimpleExample example = new SimpleExample();
            example.run();
        
          }
        
        }
    2. 让我们来看看上面的代码到底做了些什么:
      1. 创建一个Quartz Job类,必须实现 org.quartz.Job 。这个接口仅仅有一个你要实现的方法,execute方法。当中execute的接口定义例如以下  
        1.   void execute(JobExecutionContext  context throws JobExecutionException;
        2.   当Quartz调度器到约定的时间,它就会生成一个Job的实例,所以你实现Job接口 必须提供一个公有函数,否则会抛出异常。并调用execute方法.当中调度器仅仅管执行,而不关心结果。除非抛出JobExecutionException异常.
        3.  JobExecutionContext 中封装有Quartz执行所须要的全部信息。能够參见以下详细的代码片段.
      2. 当中涉及到的Scheduler、Job、Trigger 3个关键对象  (兴许会专门介绍这3个对象)
        1. 当中Scheduler调度器对象,它的方法有start()、shutdown()等方法。负责管理整个调度作业.
        2. Job 又与几个对象有关 Job、JobDetail、JobDataMap
          1. 通过类图来看他们之间的关系

          2. 通过类图能够非常明显的看出由JobExecutionContext来组装各个子组件,我们看看JobExecutionContextImpl的源码,它保存着全部上下文信息
          3.     private transient Scheduler scheduler ;
            
                private Trigger trigger;
            
                private JobDetail jobDetail;
               
                private JobDataMap jobDataMap;
            
                private transient Job job;
               
                private Calendar calendar;
            
                private boolean recovering = false;
            
                private int numRefires = 0;
            
                private Date fireTime;
            
                private Date scheduledFireTime;
            
                private Date prevFireTime;
            
                private Date nextFireTime;
               
                private long jobRunTime = -1;
               
                private Object result;
               
                private HashMap<Object, Object> data=new HashMap<Object, Object>();
          4. 关于JobDetail
            1. JobDetail不存储具体的实例,但它同意你定义一个实例。JobDetail 又指向JobDataMap
            2. JobDetail持有Job的具体信息,如它所属的组,名称等信息
          5. 关于JobDataMap
            1. JobDataMap保存着任务实例的对象,并保持着他们状态信息。它是Map接口的实现,即你能够往里面put和get一些你想存储和获取的信息.
        3. 关于Trigger
          1. 即依据详细约定的触发器,详细的如:SimpleTrigger、CronTrigger 等
  • 相关阅读:
    js获取鼠标的位置
    去掉a标签的虚线框,避免出现奇怪的选中区域
    点击按钮 可以显示隐藏
    input标签获取焦点时文本框内提示信息清空背景颜色发生变化
    ie6下面不支持!important的处理方法
    [zz]【整理】Python中Cookie的处理:自动处理Cookie,保存为Cookie文件,从文件载入Cookie
    [vim]大小写转换
    [zabbix]zabbix2.0apt源安装
    [mysql]replace
    [ethernet]ubuntu更换网卡驱动
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7123601.html
Copyright © 2020-2023  润新知