2012-11-10 38 views
1


我正在研究用Quartz調度我的應用程序,但在所有情況下,作業觸發器似乎都是一次性活動,並且對觸發器的更改需要重新部署應用程序生效。
有沒有什麼辦法可以讓我的作業觸發器檢查作業調度的更改,而無需重新部署代碼?
謝謝,
改變Quartz作業時間表

+0

你如何安排你的工作(在代碼中)?在運行時重新安排作業是完全可能的。 –

+0

目前,我將調度程序放入servlet的'init'方法中。我想要做的就是以特定的時間間隔從外部資源包中讀取CronTrigger,並使用該值刷新觸發器。 – Debojit

回答

0
  1. 陷阱一些用戶驅動的事件,如更新文本值,例如一個cron串來安排工作
  2. 找到並取消調度/刪除舊的作業和觸發器。
  3. 使用新觸發器再次安排作業。

    public static <T> T scheduleCronJob(Class<T> clazz, String cronString, String uid){ 
        try{    
         if(cronString == null){ 
          throw new CronStringConfigurationException(); 
         } 
    
         String jobGroupName = "cronJobsGroup"; 
         String jobName = "cronJob" + uid; 
         String triggerGroupName = "cronTriggers"; 
         String triggerName = "triggerFor" + uid; 
    
         JobDetail jobDetail = new JobDetail(jobName, jobGroupName, clazz); 
    
         CronTrigger trigger = new CronTrigger(
           triggerName, triggerGroupName, 
           jobName, jobGroupName, 
           cronString); 
    
         JobDataMap jobDataMap = new JobDataMap(); 
         jobDetail.setJobDataMap(jobDataMap); 
    
         getScheduler().scheduleJob(jobDetail, trigger); 
        } catch(Exception e){ 
        // print error message, throw stack trace 
        } 
        return null; 
    } 
    
    public static void reloadCronJob(Class clazz, String cronString, String uid) throws SystemException, ParseException, SchedulerException, 
        CronStringConfigurationException, PortalException{ 
        // locate the job 
        String jobGroupName = "cronJobs"; 
        String jobName = "jobFor" + uid; 
    
        if(cronString == null){ 
         throw new CronStringConfigurationException(); 
        } 
    
        JobDetail jobDetail = null; 
        Class<?> jobClass = null; 
    
        // remove the old job/trigger if it exists 
        try{ 
         jobDetail = scheduler.getJobDetail(jobName, jobGroupName); 
         if(jobDetail != null){ 
          jobClass = jobDetail.getJobClass(); 
         } 
         scheduler.deleteJob(jobName, jobGroupName); 
        } catch(Exception e){ 
         e.printStackTrace(); 
        } 
    
        if(jobClass == null){ 
         jobClass = clazz; 
        } 
    
        // create a new trigger 
        scheduleCronJob(jobClass, expandoColumnName, uid); 
    
        System.out.println("(re)scheduled job " + jobName + " using new cron string " + cronString); 
    }