企业级任务调度框架Quartz 四 多个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.      
 JobDetail jobDetail = new JobDetail(jobName,Scheduler.DEFAULT_GROUP, jobClass);       
 jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);       
 jobDetail.getJobDataMap().put("MATCH_NAME", matchName);
Trigger trigger=TriggerUtils.makeSecondlyTrigger(scanInterval);       
 trigger.setName(jobName + "-Trigger");           
 trigger.setStartTime(new Date());        
 scheduler.scheduleJob(jobDetail, trigger);
    

在注册后,任务调度器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. }  
/**
 * 一个简短的作业调度器
 * @author liuwei
 *
 */
public class SimpleScheduler2 {
 static Log logger = LogFactory.getLog(SimpleScheduler.class);
 private Scheduler scheduler;
	
/**
 * 调度器的启动操作
 */
public void startScheduler() {
  try {
    LogUtil.print("运行任务开始");
    // 启动任务调度器
    this.getScheduler().start();
			
    /*将扫描目录的作业job注册到作业调度器上*/
    this.registJobtoScheduler();
    LogUtil.print("运行任务完毕");
   } catch (SchedulerException ex) {
    logger.error(ex);
    }
  }
	
  /**
   * 调度器的暂停操作
    * @param scheduler
   */
  public void modifyScheduler(Scheduler scheduler) {       
   try {       
    if (!scheduler.isInStandbyMode()) { 
    //暂停调度器,该任务调度器上所有的作业实例都将停止工作
       scheduler.standby();       
    }          
    scheduler.start();       
    } catch (SchedulerException ex) {       
      logger.error(ex);       
   }       
 } 
	
   /**
    * 注册一个作业到作业调度器
     * @throws SchedulerException
    * 注册一个作业到任务调度器上需要两个参数
     * a.作业明细
     * b.作业触发器
     */
  public void registJobtoScheduler() throws SchedulerException{
	LogUtil.print("将作业注册到调度器上");
         //获取任务调度器实例
	Scheduler scheduler=this.getScheduler();
        //任务1的相关信息
	String dirPath = "E:\\重要";
	String matchName = ".rar";
	String jobName="ScanDirectoryJob1";
        //注册操作
	this.registOperation(scheduler, jobName,     
         ScanDirectoryJob.class, 10, dirPath, matchName);
        //任务2的相关信息
	String dirPath1 = "E:\\重要";
	String matchName2 = ".xls";
	String jobName2="ScanDirectoryJob2";
        //注册操作
	this.registOperation(scheduler, jobName2, 
         ScanDirectoryJob.class, 10, dirPath1, matchName2);
   }
   
   /**
    *根据任务调度器,作业名称,作业类,启动时间间隔,及作业信息
    *注册两个作业任务到任务调度器上
    */
   private void registOperation(Scheduler scheduler, String jobName,  
   Class jobClass, int scanInterval,String dirPath,String matchName )
   {     
        try {
        //创建任务的作业信息
         //1)作业明细,作业数据集合,触发器
         //2)根据作业明细,触发器来实现任务的注册
        JobDetail jobDetail = new JobDetail
        (jobName,Scheduler.DEFAULT_GROUP, jobClass);       
        jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);       
        jobDetail.getJobDataMap().put("MATCH_NAME", matchName);
        Trigger trigger = TriggerUtils.makeSecondlyTrigger  
        (scanInterval);       
        trigger.setName(jobName + "-Trigger");           
        trigger.setStartTime(new Date());        
        scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
	 e.printStackTrace();
        }       

    }
	

  /**
   * 根据调度器工厂获得一个调度器
    * @return
   */
  private Scheduler getScheduler(){
   Scheduler  scheduler=null;
    try {
       LogUtil.print("获取任务调度器实例");
       //根据调度器工厂获得一个任务调度器的实例
        scheduler = StdSchedulerFactory.getDefaultScheduler();
		}catch (SchedulerException ex) {
		logger.error(ex);
       }
	return scheduler;
  }
	
  private void setScheduler(Scheduler scheduler){
	his.scheduler=scheduler;
   }
}


请大家关注一个点!!!
   在 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操作完毕!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值