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"); } }