zoukankan      html  css  js  c++  java
  • 企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上

    前序:
        在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动;下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上!
        首先一个job类指向两个任务,则任务性质可能一样,但任务信息存在差异;我们需要创建两个不同属性信息的job类实例;这个创建的动作是由Scheduler来完成;前面我们已经说了,它获取job信息并创建实例的前提操作如下:
       

    Java代码  收藏代码
    1. JobDetail jobDetail = new JobDetail(jobName,Scheduler.DEFAULT_GROUP, jobClass);         
    2. jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);         
    3. jobDetail.getJobDataMap().put("MATCH_NAME", matchName);  
    4. rigger trigger=TriggerUtils.makeSecondlyTrigger(scanInterval);         
    5. trigger.setName(jobName + "-Trigger");             
    6. trigger.setStartTime(new Date());          
    7. scheduler.scheduleJob(jobDetail, trigger);  
    8.      


    在注册后,任务调度器Scheduler就可以创建job实例,并执行execute操作了;
      下面是我们在任务调度器上要求执行两个任务的代码:

    Java代码  收藏代码
    1. /** 
    2.  * 一个简短的作业调度器 
    3.  * @author liuwei 
    4.  * 
    5.  */  
    6. public class SimpleScheduler2 {  
    7.  static Log logger = LogFactory.getLog(SimpleScheduler.class);  
    8.  private Scheduler scheduler;  
    9.       
    10. /** 
    11.  * 调度器的启动操作 
    12.  */  
    13. public void startScheduler() {  
    14.   try {  
    15.     LogUtil.print("运行任务开始");  
    16.     // 启动任务调度器  
    17.     this.getScheduler().start();  
    18.               
    19.     /*将扫描目录的作业job注册到作业调度器上*/  
    20.     this.registJobtoScheduler();  
    21.     LogUtil.print("运行任务完毕");  
    22.    } catch (SchedulerException ex) {  
    23.     logger.error(ex);  
    24.     }  
    25.   }  
    26.       
    27.   /** 
    28.    * 调度器的暂停操作 
    29.     * @param scheduler 
    30.    */  
    31.   public void modifyScheduler(Scheduler scheduler) {         
    32.    try {         
    33.     if (!scheduler.isInStandbyMode()) {   
    34.     //暂停调度器,该任务调度器上所有的作业实例都将停止工作  
    35.        scheduler.standby();         
    36.     }            
    37.     scheduler.start();         
    38.     } catch (SchedulerException ex) {         
    39.       logger.error(ex);         
    40.    }         
    41.  }   
    42.       
    43.    /** 
    44.     * 注册一个作业到作业调度器 
    45.      * @throws SchedulerException 
    46.     * 注册一个作业到任务调度器上需要两个参数 
    47.      * a.作业明细 
    48.      * b.作业触发器 
    49.      */  
    50.   public void registJobtoScheduler() throws SchedulerException{  
    51.     LogUtil.print("将作业注册到调度器上");  
    52.          //获取任务调度器实例  
    53.     Scheduler scheduler=this.getScheduler();  
    54.         //任务1的相关信息  
    55.     String dirPath = "E:\重要";  
    56.     String matchName = ".rar";  
    57.     String jobName="ScanDirectoryJob1";  
    58.         //注册操作  
    59.     this.registOperation(scheduler, jobName,       
    60.          ScanDirectoryJob.class10, dirPath, matchName);  
    61.         //任务2的相关信息  
    62.     String dirPath1 = "E:\重要";  
    63.     String matchName2 = ".xls";  
    64.     String jobName2="ScanDirectoryJob2";  
    65.         //注册操作  
    66.     this.registOperation(scheduler, jobName2,   
    67.          ScanDirectoryJob.class10, dirPath1, matchName2);  
    68.    }  
    69.      
    70.    /** 
    71.     *根据任务调度器,作业名称,作业类,启动时间间隔,及作业信息 
    72.     *注册两个作业任务到任务调度器上 
    73.     */  
    74.    private void registOperation(Scheduler scheduler, String jobName,    
    75.    Class jobClass, int scanInterval,String dirPath,String matchName )  
    76.    {       
    77.         try {  
    78.         //创建任务的作业信息  
    79.          //1)作业明细,作业数据集合,触发器  
    80.          //2)根据作业明细,触发器来实现任务的注册  
    81.         JobDetail jobDetail = new JobDetail  
    82.         (jobName,Scheduler.DEFAULT_GROUP, jobClass);         
    83.         jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);         
    84.         jobDetail.getJobDataMap().put("MATCH_NAME", matchName);  
    85.         Trigger trigger = TriggerUtils.makeSecondlyTrigger    
    86.         (scanInterval);         
    87.         trigger.setName(jobName + "-Trigger");             
    88.         trigger.setStartTime(new Date());          
    89.         scheduler.scheduleJob(jobDetail, trigger);  
    90.         } catch (SchedulerException e) {  
    91.      e.printStackTrace();  
    92.         }         
    93.   
    94.     }  
    95.       
    96.   
    97.   /** 
    98.    * 根据调度器工厂获得一个调度器 
    99.     * @return 
    100.    */  
    101.   private Scheduler getScheduler(){  
    102.    Scheduler  scheduler=null;  
    103.     try {  
    104.        LogUtil.print("获取任务调度器实例");  
    105.        //根据调度器工厂获得一个任务调度器的实例  
    106.         scheduler = StdSchedulerFactory.getDefaultScheduler();  
    107.         }catch (SchedulerException ex) {  
    108.         logger.error(ex);  
    109.        }  
    110.     return scheduler;  
    111.   }  
    112.       
    113.   private void setScheduler(Scheduler scheduler){  
    114.     his.scheduler=scheduler;  
    115.    }  
    116. }  



    请大家关注一个点!!!
       在 Scheduler 启动之前还是之后安排 Job 代码也就是任务调度器启动在先,还是说等所有工作在任务调度器上全部完成注册以后再开始启动呢?
       实际上之前之后的效果是一样;我们可以认为:
       a.若你先前启动,则当前作业还未在其上注册的话,启动后,任务调度器将处于等待状态,在(Job)作业在其上面进行注册后,则任务调度器将根据相关信息创建作业实例,并执行excute方法;
       b.若在注册后执行start方法的话,则任务调度器将立即创建作业实例,并执行excute方法;

       下面是两个任务同时执行的日志效果:
    2009-02-02 22:35:05,468 [SimpleScheduler]-[DEBUG] 运行任务开始
    2009-02-02 22:35:05,468 [SimpleScheduler]-[DEBUG] 将作业注册到调度器上
    2009-02-02 22:35:05,468 [SimpleScheduler]-[DEBUG] 获取任务调度器实例
    2009-02-02 22:35:05,781 [org.quartz.simpl.SimpleThreadPool]-[INFO] Job execution threads will use class loader of thread: main
    2009-02-02 22:35:05,875 [org.quartz.core.SchedulerSignalerImpl]-[INFO] Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
    2009-02-02 22:35:05,890 [org.quartz.core.QuartzScheduler]-[INFO] Quartz Scheduler v.1.6.4 created.
    2009-02-02 22:35:05,906 [org.quartz.simpl.RAMJobStore]-[INFO] RAMJobStore initialized.
    2009-02-02 22:35:05,921 [org.quartz.impl.StdSchedulerFactory]-[INFO] Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
    2009-02-02 22:35:05,921 [org.quartz.impl.StdSchedulerFactory]-[INFO] Quartz scheduler version: 1.6.4
    2009-02-02 22:35:06,000 [SimpleScheduler]-[DEBUG] 获取任务调度器实例
    2009-02-02 22:35:06,000 [org.quartz.core.QuartzScheduler]-[INFO] Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
    2009-02-02 22:35:06,000 [SimpleScheduler]-[DEBUG] 运行任务完毕
    2009-02-02 22:35:06,015 [org.quartz.simpl.SimpleJobFactory]-[DEBUG] Producing instance of Job 'DEFAULT.ScanDirectoryJob1', class=ScanDirectoryJob
    2009-02-02 22:35:06,015 [org.quartz.simpl.SimpleJobFactory]-[DEBUG] Producing instance of Job 'DEFAULT.ScanDirectoryJob2', class=ScanDirectoryJob
    2009-02-02 22:35:06,015 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob1
    2009-02-02 22:35:06,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1准备开始!
    2009-02-02 22:35:06,015 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob2
    2009-02-02 22:35:06,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2准备开始!
    2009-02-02 22:35:06,109 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要CLPM绩效评价表(贷中组).xls - Size: 60416
    2009-02-02 22:35:06,109 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要10月考核.rar - Size: 75058
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要8月绩效.rar - Size: 86177
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组5月考核.rar - Size: 77959
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组6月考核.rar - Size: 32950
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组7月考核.rar - Size: 32565
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要刘伟出差借款表.xls - Size: 10752
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要开发任务跟踪表.xls - Size: 687616
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要机票(刘伟).xls - Size: 13312
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2操作完毕!
    2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1操作完毕!
    2009-02-02 22:35:15,984 [org.quartz.simpl.SimpleJobFactory]-[DEBUG] Producing instance of Job 'DEFAULT.ScanDirectoryJob1', class=ScanDirectoryJob
    2009-02-02 22:35:15,984 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob1
    2009-02-02 22:35:15,984 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1准备开始!
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要10月考核.rar - Size: 75058
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要8月绩效.rar - Size: 86177
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组5月考核.rar - Size: 77959
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组6月考核.rar - Size: 32950
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组7月考核.rar - Size: 32565
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1操作完毕!
    2009-02-02 22:35:16,000 [org.quartz.simpl.SimpleJobFactory]-[DEBUG] Producing instance of Job 'DEFAULT.ScanDirectoryJob2', class=ScanDirectoryJob
    2009-02-02 22:35:16,000 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob2
    2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2准备开始!
    2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要CLPM绩效评价表(贷中组).xls - Size: 60416
    2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要刘伟出差借款表.xls - Size: 10752
    2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要开发任务跟踪表.xls - Size: 687616
    2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要机票(刘伟).xls - Size: 13312
    2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2操作完毕!
    2009-02-02 22:35:25,984 [org.quartz.simpl.SimpleJobFactory]-[DEBUG] Producing instance of Job 'DEFAULT.ScanDirectoryJob1', class=ScanDirectoryJob
    2009-02-02 22:35:25,984 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob1
    2009-02-02 22:35:25,984 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1准备开始!
    2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要10月考核.rar - Size: 75058
    2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要8月绩效.rar - Size: 86177
    2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组5月考核.rar - Size: 77959
    2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组6月考核.rar - Size: 32950
    2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要贷中组7月考核.rar - Size: 32565
    2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1操作完毕!
    2009-02-02 22:35:26,015 [org.quartz.simpl.SimpleJobFactory]-[DEBUG] Producing instance of Job 'DEFAULT.ScanDirectoryJob2', class=ScanDirectoryJob
    2009-02-02 22:35:26,015 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob2
    2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2准备开始!
    2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要CLPM绩效评价表(贷中组).xls - Size: 60416
    2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要刘伟出差借款表.xls - Size: 10752
    2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要开发任务跟踪表.xls - Size: 687616
    2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:重要机票(刘伟).xls - Size: 13312
    2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2操作完毕!

  • 相关阅读:
    学习 WebService 第三步:一个简单的实例(RAD+WAS 8.5开发SOAP项目)
    学习 WebService 第二步:知识准备——WSDL文件解析
    学习 WebService 第一步:体系结构、三元素SOAP/WSDL/UDDI
    在 IBM RAD 平台上基于 JAX-WS 开发 Web Services服务器端,客户端
    使用 SOAPUI 测试Web Service
    HTTP 方法:GET 对比 POST
    第一个 XMLHttpRequest 例子(API)
    JAVA基础知识之JVM-——JAVA关键字
    JAVA基础知识之JVM-——使用反射生成并操作对象
    JAVA基础知识之JVM-——通过反射查看类信息
  • 原文地址:https://www.cnblogs.com/chasewade/p/3372602.html
Copyright © 2011-2022 走看看