springMVC + quartz實現定時器(任務排程器)
阿新 • • 發佈:2018-11-09
首先我們要知道任務排程器(定時器)有幾種,這邊我會寫三種
第一種是基於JDK的本身的一個定時器(優點:簡單,缺點:滿足不了複雜的需求)
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
package com.timer1; import java.util.Date; import java.util.TimerTask; /** * jdk自帶的定時器 不需要引入任何的jar * @author Administrator */ public class JdkTimerTask extends TimerTask { int a = 1; @Override public void run() { System.out.println("我的定時任務 " + new Date() + " " + a++ ); } }
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
測試類
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
package com.timer1; import java.util.Timer; public class TestTimerTask { public static void main(String[] args) { // 新建一個 timer Timer t = new Timer("定時任務"); // 執行我們的定時任務 第一個引數是 定時任務物件 0 是立即開始 3000 每隔3秒鐘執行一次 t.schedule(new JdkTimerTask(), 0 , 3000); } }
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
第二種是基於 Quartz的純程式碼去實現的, 需要下載Quartz的jar ,而 jar的版本不一樣實現的方式又不一樣
以下程式碼是基於 quartz-all-1.6.1.jar 版本 和 quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3) 去實現兩種方式的,兩種只能選擇一種。
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
package com.timer3; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * 定時任務 * @author Administrator */ public class QuartzTimer implements Job { int a = 1; @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("我的quartz定時任務" + new Date() + " " + a++); } }
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
以下是測試方式(注:因為兩種模式寫在一起了 所以jar包匯入可能不對,需要以引用的jar的版本為準)
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
package com.timer3; import java.text.ParseException; import java.util.Date; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; public class TestQuartzTimer { public static void main(String[] args) throws SchedulerException, ParseException { /** * jar 版本 quartz-all-1.6.1.jar */ // 新建一個定時任務處理類 jobDetail //JobDetail jobDetail = new JobDetail("quartzTimer","quartzTimerGroup" , QuartzTimer.class); // 建立定時器觸發器 /*SimpleTrigger simpleTrigger = new SimpleTrigger("quartzTimerTrigger", "quartzTimerTriggerGroup"); // 什麼時間點執行 new Date()立即啟動 simpleTrigger.setStartTime(new Date()); // 執行多少次 10 次 simpleTrigger.setRepeatCount(10); // 每隔多少秒執行一次 1000是代表1秒 simpleTrigger.setRepeatInterval(1000);*/ // 表示式的觸發器 兩個觸發器只需要一個就好了。 /*CronTrigger cronTrigger = new CronTrigger("quartzTimerCronTrigger", "quartzTimerCronTriggerGroup"); // 新建一個表示式 CronExpression cronExpression = new CronExpression("0/5 32/1 0-23 * * ? *"); // 將表示式放入 觸發器 cronTrigger.setCronExpression(cronExpression); // 新建一個計劃共工廠 StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory(); // 獲取到一個計劃任務 Scheduler scheduler = stdSchedulerFactory.getScheduler(); // 將定時器任務處理類和觸發器結合在一起 scheduler.scheduleJob(jobDetail, cronTrigger); // 啟動觸發器 scheduler.start();*/ //quartz 2.X版本以上做法 ++++++++++++++++++++++++++++++++++++++++++++++++ /** * quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3) */ // 通過 schedulerFactory 獲取一個排程器 /*SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); // 建立 jobDetail 例項,繫結 Job 實現類 // 指明 job 的名稱,所在組的名稱,以及繫結 job 類 JobDetail job = JobBuilder.newJob(QuartzTimer.class).withIdentity("job1", "group1").build(); // 定義排程觸發規則 // SimpleTrigger,從當前時間的下 1 秒開始,每隔 1 秒執行 1 次,重複執行 2 次 Trigger trigger = TriggerBuilder.newTrigger() // 指明 trigger 的 name 和 group .withIdentity("trigger1", "group1") // 從當前時間的下 1 秒開始執行,預設為立即開始執行(.startNow()) .startAt(DateBuilder.evenSecondDate(new Date())) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(1) // 每隔 1 秒執行 1 次 .withRepeatCount(2)) // 重複執行 2 次,一共執行 3 次 .build(); // corn 表示式,先立即執行一次,然後每隔 5 秒執行 1 次 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("*\/5 * * * * ?")) .build(); // 把作業和觸發器註冊到任務排程中 sched.scheduleJob(job, trigger); // 啟動計劃程式(實際上直到排程器已經啟動才會開始執行) sched.start(); // 等待 10 秒,使我們的 job 有機會執行 //Thread.sleep(10000); // 等待作業執行完成時才關閉排程器 //sched.shutdown(true); */ } }
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
springMVC + Quartz 配置檔案的兩種實現方式實現 需要用(quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3) jar包
第一種 需要繼承QuartzJobBean
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
package com.timer4; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.SchedulerException; import org.quartz.spi.JobFactory; import org.quartz.spi.TriggerFiredBundle; import org.springframework.scheduling.quartz.QuartzJobBean; /** * 定時任務 * @author Administrator */ public class QuartzTimer extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { System.out.println("我的Spring管理quartz定時任務" + new Date()); } }
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
spring中的配置方式
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
<!-- 第一種 --> <!-- 任務排程處理類工廠 --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.timer4.QuartzTimer"></property> </bean> <!-- 表示式觸發器工廠 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail"></property> <property name="cronExpression" value="0/5 13/1 0-23 * * ? *"></property> </bean> <!-- 任務排程計劃工廠 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
第二種不需要繼承任何類
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
package com.timer4; import java.util.Date; public class QuartzTimer2 { protected void execute() { System.out.println("我的Spring管理quartz定時任務2222" + new Date()); } }
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
spring 中配置方式
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
<!-- 第二種 要排程的物件--> <bean id="jobBean" class="com.timer4.QuartzTimer2" /> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="jobBean" /> <property name="targetMethod" value="execute" /> <!--將併發設定為false--> <property name="concurrent" value="false" /> </bean> <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail" /> <!--表示式,我的是每 5s 執行一次--> <property name="cronExpression" value="0/5 * * * * ?" /> </bean> <!-- 總管理類如果將lazy-init='false'那麼容器啟動就會執行排程程式 --> <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" > <property name="triggers"> <list> <!--作業排程器,list下可加入其他的排程器--> <ref bean="trigger" /> </list> </property> </bean>
![複製程式碼](https://common.cnblogs.com/images/copycode.gif)
Spring + SpringMVC + Quartz jar下載地址:http://pan.baidu.com/s/1nuHIUvv ,密碼 :28ar