Quartz(二)在Spring中動態啓動,暫定,添加,刪除定時功能

動態啓動,暫定,添加,刪除定時功能,可傳參數
Spring中使用Quartz的3種方法(MethodInvokingJobDetailFactoryBean,implements Job,extends QuartzJobBean)
以下介紹一下實現job接口的方法,通過此方法可以動態啓動,暫定,添加,刪除定時功能,可傳參數。
所有數據全部持久化到數據表中,不再需要XML配置文件存儲數據。quartz已經封裝了持久化方法。數據表用的MYSQL見附件
配置quartz. properties
Java代碼
#============================================================================  
# Configure Main Scheduler Properties    
#============================================================================  
   
org.quartz.scheduler.instanceName = TestScheduler  
org.quartz.scheduler.instanceId = AUTO  
   
#============================================================================  
# Configure ThreadPool    
#============================================================================  
   
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
org.quartz.threadPool.threadCount = 5 
org.quartz.threadPool.threadPriority = 4 
   
#============================================================================  
# Configure JobStore    
#============================================================================  
   
org.quartz.jobStore.misfireThreshold = 60000 
   
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
   
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
##org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate  
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate  
org.quartz.jobStore.dataSource = myDS  
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.isClustered = false 
   
#============================================================================  
# Configure Datasources    
#============================================================================  
   
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver  
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf8  
org.quartz.dataSource.myDS.user = root  
org.quartz.dataSource.myDS.password =   
org.quartz.dataSource.myDS.maxConnections = 5 
   
#org.quartz.dataSource.myDS.driver = org.postgresql.Driver  
#org.quartz.dataSource.myDS.URL = jdbc:postgresql:dev  
#org.quartz.dataSource.myDS.user = jhouse  
#org.quartz.dataSource.myDS.password =   
#org.quartz.dataSource.myDS.maxConnections = 5 
   
#============================================================================  
# Configure Plugins   
#============================================================================  
   
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin  
 
#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin  
# init plugin will load jobs.xml as a classpath resource i.e. /jobs.xml if not found on file system  
#org.quartz.plugin.jobInitializer.fileName=jobs.xml  
#org.quartz.plugin.jobInitializer.overWriteExistingJobs = false 
#org.quartz.plugin.jobInitializer.failOnFileNotFound = false 

#============================================================================
# Configure Main Scheduler Properties 
#============================================================================
 
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO
 
#============================================================================
# Configure ThreadPool 
#============================================================================
 
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 4
 
#============================================================================
# Configure JobStore 
#============================================================================
 
org.quartz.jobStore.misfireThreshold = 60000
 
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
##org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
 
#============================================================================
# Configure Datasources 
#============================================================================
 
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf8
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password =
org.quartz.dataSource.myDS.maxConnections = 5
 
#org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql:dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password =
#org.quartz.dataSource.myDS.maxConnections = 5
 
#============================================================================
# Configure Plugins
#============================================================================
 
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
# init plugin will load jobs.xml as a classpath resource i.e. /jobs.xml if not found on file system
#org.quartz.plugin.jobInitializer.fileName=jobs.xml
#org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
#org.quartz.plugin.jobInitializer.failOnFileNotFound = false
在這裏採用JobStoreTX,將任務持久化到數據中,而不再是簡單的內存方式:RAMJobStore
在XML里加入:
在web.xml中添加QuartzInitializerServlet,Quartz爲能夠在web應用中使用,提供了一個QuartzInitializerServlet和一個QuartzInitializerListener,用於在加載web應用時,對quartz進行初始化。
Xml代碼
<servlet> 
      <servlet-name> 
          QuartzInitializer  
      </servlet-name> 
      <servlet-class> 
          org.quartz.ee.servlet.QuartzInitializerServlet  
      </servlet-class> 
      <init-param> 
          <param-name>config-file</param-name> 
          <param-value>/quartz.properties</param-value> 
      </init-param> 
      <init-param> 
          <param-name>shutdown-on-unload</param-name> 
          <param-value>true</param-value> 
      </init-param> 
      <load-on-startup>1</load-on-startup> 
  </servlet> 

   <servlet>
         <servlet-name>
             QuartzInitializer
         </servlet-name>
         <servlet-class>
             org.quartz.ee.servlet.QuartzInitializerServlet
         </servlet-class>
         <init-param>
             <param-name>config-file</param-name>
             <param-value>/quartz.properties</param-value>
         </init-param>
         <init-param>
             <param-name>shutdown-on-unload</param-name>
             <param-value>true</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>

Java代碼
public interface TimerService  
{  
    public void setJobName(String jobName);  
 
    public void setJobGroup(String jobGroup);  
      
    public void setClassName(String string);  
      
    public void setCronExpression(String cronExpression);  
 
    public void setParameterNames(String[] strings);  
 
    public void setParameterValues(String[] strings);  
      
    /** 
     * 設置定時時間 
     * @param request 
     * @param jobName 
     * @param jobGroup 
     * @param triggerName 
     * @param triggerGroup 
     * @param cronExpression 
     */ 
    void saveCron(HttpServletRequest request,String jobName,String jobGroup,String triggerName,String triggerGroup,String cronExpression) throws SchedulerException, ParseException;  
      
    /** 
     * 刪除定時器 
     * @param request 
     * @param jobName 
     * @param jobGroup 
     */ 
    void deleteTimer(HttpServletRequest request,String jobName,String jobGroup) throws SchedulerException;  
      
    /** 
     * 立即執行定時功能 
     * @param request 
     * @param jobName 
     * @param jobGroup 
     */ 
    void runNowTimer(HttpServletRequest request,String jobName,String jobGroup) throws SchedulerException;  
      
    /** 
     * 根據名稱和組別暫停Tigger 
     * @param triggerName 
     * @param group 
     */ 
    void pauseTrigger(HttpServletRequest request,String triggerName,String group) throws SchedulerException;  
      
    /** 
     * 恢復Trigger 
     * @param triggerName 
     * @param group 
     */ 
    void resumeTrigger(HttpServletRequest request,String triggerName,String group) throws SchedulerException;  
      
    /** 
     * 刪除Trigger 
     * @param triggerName 
     * @param group 
     */ 
    boolean removeTrigdger(HttpServletRequest request,String triggerName,String group) throws SchedulerException;  
}  
 
public class TimerServiceImpl implements TimerService  
{  
    private ApplicationContext appCtx = null;  
    private Scheduler scheduler;  
    private String jobName = "";  
    private String jobGroup ="";  
    private String className = "";  
    private String cronExpression = "";  
    private String parameterNames[] = {};  
    private String parameterValues[] = {};  
    private JobDetail jobDetail = new JobDetail();  
 
    public String getJobName() {  
        return jobName;  
    }  
 
    public void setJobName(String jobName) {  
        this.jobName = jobName;  
    }  
 
    public String getJobGroup() {  
        return jobGroup;  
    }  
 
    public void setJobGroup(String jobGroup) {  
        this.jobGroup = jobGroup;  
    }  
 
    public String getClassName() {  
        return className;  
    }  
 
    public void setClassName(String string) {  
        className = string.trim();  
    }  
 
    public String getCronExpression() {  
        return cronExpression;  
    }  
      
    public void setCronExpression(String cronExpression) {  
        this.cronExpression = cronExpression;  
    }  
      
    public JobDetail getJobDetail() {  
        return jobDetail;  
    }  
 
    public void setJobDetail(JobDetail detail) {  
        jobDetail = detail;  
    }  
 
    public String[] getParameterNames() {  
        return parameterNames;  
    }  
 
    public String[] getParameterValues() {  
        return parameterValues;  
    }  
 
    public void setParameterNames(String[] strings) {  
        parameterNames = strings;  
    }  
 
    public void setParameterValues(String[] strings) {  
        parameterValues = strings;  
    }  
 
    public void saveTimer(HttpServletRequest request, String[] parameterNames,String[] parameterValues,JobDetail jobDetail)   
       throws SchedulerException, ClassNotFoundException   
    {  
        className = jobDetail.getJobClass().getName();  
        Class jobClass = Class.forName(className);  
        jobDetail.setJobClass(jobClass);      
        for (int i =0; i < parameterNames.length; i++) {  
            if (parameterNames[i].trim().length() > 0 && parameterValues[i].trim().length() > 0) {  
                jobDetail.getJobDataMap().put(parameterNames[i].trim(), parameterValues[i].trim());  
                jobDetail.getJobDataMap().put(parameterNames[i].trim(), parameterValues[i].trim());  
            }  
        }  
        boolean replace = true;  
        scheduler = ScheduleBase.getCurrentScheduler(request);  
        scheduler.addJob(jobDetail, replace);  
    }  
 
    public void saveCron(HttpServletRequest request, String jobName, String jobGroup, String triggerName  
       , String triggerGroup, String cronExpression) throws SchedulerException, ParseException   
    {  
        CronTrigger trigger = null;  
        if (cronExpression.length() > 2) {  
            trigger = new CronTrigger(triggerName,triggerGroup,jobName,jobGroup,cronExpression);  
        }  
        trigger.setVolatility(false);  
        scheduler = ScheduleBase.getCurrentScheduler(request);  
        scheduler.scheduleJob(trigger);  
    }  
      
    public void deleteTimer(HttpServletRequest request, String jobName,String jobGroup) throws SchedulerException   
    {  
        this.jobDetail = scheduler.getJobDetail(jobName, jobGroup);  
        if(this.jobDetail!=null){  
            scheduler = ScheduleBase.getCurrentScheduler(request);  
            scheduler.deleteJob(jobName, "DEFAULT");  
        }  
    }  
 
    public void runNowTimer(HttpServletRequest request, String jobName,String jobGroup) throws SchedulerException   
    {  
        scheduler = ScheduleBase.getCurrentScheduler(request);  
        scheduler.triggerJob(jobName, jobGroup);  
    }  
      
    public void pauseTrigger(HttpServletRequest request, String triggerName,String group) throws SchedulerException  
    {     
        scheduler = ScheduleBase.getCurrentScheduler(request);  
        scheduler.pauseTrigger(triggerName, group);//停止觸發器  
    }  
      
    public void resumeTrigger(HttpServletRequest request, String triggerName,String group) throws SchedulerException  
    {         
        scheduler = ScheduleBase.getCurrentScheduler(request);  
        //Trigger trigger = scheduler.getTrigger(triggerName, group);  
        scheduler.resumeTrigger(triggerName, group);//重啓觸發器  
    }  
      
    public boolean removeTrigdger(HttpServletRequest request, String triggerName,String group) throws SchedulerException  
    {         
        scheduler = ScheduleBase.getCurrentScheduler(request);  
        scheduler.pauseTrigger(triggerName, group);//停止觸發器  
        return scheduler.unscheduleJob(triggerName, group);//移除觸發器  
    }  
      
    public void timerDataJob(JobExecutionContext context)   
    {  
    }  
}  
//實現job接口才能定時運行  
public class TimerDataJob implements Job  
{  
 
    private ApplicationContext appCtx = null;  
    private TimerService timerService = null;  
    public void execute(JobExecutionContext context)  
            throws JobExecutionException  
    {  
        try {  
            Map parameters=context.getJobDetail().getJobDataMap();  
            String str = (String)parameters.get("");//通過此方法獲得需要的參數  
            appCtx = ApplicationContextKeeper.getAppCtx();//servlet類,項目啓動時講配置文件讀入  
            timerService = (TimerService)appCtx.getBean("timerService");  
            System.out.println("----------定時結束-----------");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

 

來源:http://mengqingyu.iteye.com/blog/568935


發佈了108 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章