Spring整合Quartz實現持久化、動態設定時間

1、spring整合java

  網上一搜有不少整合的方式,這裏我採用了其中的一種(暫時尚未對其餘的方法研究過)。mysql

  對於spring的整合其中的任務,spring提供了幾個類、接口(這些類都實現了Job接口):spring

  org.springframework.scheduling.quartz.QuartzJobBeansql

  org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.MethodInvokingJob 數據庫

  org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJobexpress

  

  QuartzJobBean和MethodInvokingJob是無狀態的,StatefulMethodInvokingJob是有狀態的。app

  能夠選擇本身的需求選擇繼承與哪一個類。 ide

  關於Scheduler在Spring上的配置:post

複製代碼
    <bean name="quartzScheduler" lazy-init="false"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
        <property name="dataSource">  
            <ref bean="dataSource" />  
        </property> 
        
        <property name="applicationContextSchedulerContextKey"  
                    value="applicationContextKey" /> 
         <property name="autoStartup" value="true" />
        <property name="configLocation" value="classpath:spring/quartz.properties"/> 
    </bean> 
複製代碼

  注意:其中lazy-init="false",和 <property name="autoStartup" value="true"/>最好按照本身的需求做統一的配置測試

2、quartz.properties 配置持久化的信息

複製代碼
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#============================================================================
# Configure JobStore
#============================================================================
#org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#havent cluster spring
#org.quartz.jobStore.dataSource = myDS 
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.isClustered = false  
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#==============================================================  
#Non-Managed Configure Datasource  if you don't use spring cluster
#==============================================================   
#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver   
#org.quartz.dataSource.myDS.URL = jdbc\:mysql\://localhost\:3306/qrtz  
#org.quartz.dataSource.myDS.user = root   
#org.quartz.dataSource.myDS.password = root 
#org.quartz.dataSource.myDS.maxConnections =10  
複製代碼

  這裏要備註的是:org.quartz.jobStore.misfireThreshold = 60000

  這個屬性是配置當發現觸發器過期,容許作就以內的trigger任有效。對於詳細瞭解其中的機制,能夠查看數據庫的變化,特別是數據庫中的QRTZ_FIRED_TRIGGERS表。

  對於其狀態有ACQUIRED和EXECUTING兩個狀態進行轉化,並所以會影響QRTZ_TRIGGERS的表的數據。(我的猜測:quartz是利用這幾個字段來保存斷點的)

3、下面是項目的搭建代碼:

  任務類信息類JobModel  

複製代碼
public class JobModel {
    private String jobName; 
    private String group;//對於job,trigger相互綁定的,採用相同的group 
    private Class<?> jobClass;
    private Trigger trigger;
    public JobModel() {
        super();
    }
        //.....getter,setter   
}
複製代碼

  定義一個無狀態的Job(若定義一個有狀態的Job,須要繼承與StatefulMethodInvokingJob)

複製代碼
public class CommonJob extends MethodInvokingJob{
    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println("commonJob executing ...");
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        int value = Integer.parseInt(dataMap.getString("key"));
        System.out.println("value is " + value);
        dataMap.put("key", new Integer(++value).toString());
        
    }
}
複製代碼

  SchedulerManager一共對在scheduler中操做job

複製代碼
public class QrtzManager {
    private static Scheduler scheduler;
    static {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext-quartz2.xml");
        scheduler = (StdScheduler) context.getBean("quartzScheduler");
    }
    public void standBy(){
        try {
            scheduler.standby();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    //add a job
    public void deploy(JobModel model,JobDataMap dataMap){
        JobDetail jobDetail = new JobDetail(model.getJobName(),model.getGroup(),model.getJobClass());
        jobDetail.setJobDataMap(dataMap);
        try {
            scheduler.scheduleJob(jobDetail,model.getTrigger());
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    //delete a job
    public void unDeploy(String jobName,String group){
        if (jobName.equals("") || group.equals("")) {
            return ;
        }
        try {
            scheduler.deleteJob(jobName, group);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        
    }
}
複製代碼

測試類

複製代碼
package com.lps.schedulerserver.service02;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;

public class Main {
    public static void main(String[] args) {
    
        Trigger trigger = new SimpleTrigger("trigger02", "group02", new Date(), parse("2012-12-12 18:30:00"), 5, 10000L);
        JobModel model1 = new JobModel("job01", "group01", CommonJob.class, trigger);
        String expression = "0/15 * * ? * *";
        Trigger trigger2 = null;
        try {
            trigger2 = new CronTrigger("trigger01", "group", expression);
            trigger2.setStartTime(new Date());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        JobModel model2 = new JobModel("job02","group02",StatefulJob.class,trigger2);
        QrtzManager manager = new QrtzManager();
        //jobdatamap
        JobDataMap dataMap = new JobDataMap();
        dataMap.put("key", "1");
        manager.deploy(model2, dataMap);
        System.out.println("deploy model2 at:"+new Date());
    }
    public static Date parse(String str){
        DateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        Date date = null ;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    @Test
    public void deleteJob(){
        QrtzManager manager = new QrtzManager();
        manager.unDeploy("job01","group01");
    }
}
複製代碼
相關文章
相關標籤/搜索