摘要:時(shí)間年月日星期一說明本文部分內(nèi)容均來自慕課網(wǎng)。屬性任務(wù)名稱任務(wù)所屬組任務(wù)實(shí)現(xiàn)類傳參的作用淺談上是什么當(dāng)調(diào)用一個(gè),就會(huì)將傳遞給的方法能通過對(duì)象訪問到運(yùn)行時(shí)候的環(huán)境以及本身的明細(xì)數(shù)據(jù)。
時(shí)間:2017年06月26日星期一
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)示例源碼:https://github.com/zccodere/s...
個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s...
Quartz概要
OpenSymphony提供的強(qiáng)大的開源任務(wù)調(diào)度框架 官網(wǎng):http://www.quartz-scheduler.org 純Java實(shí)現(xiàn),精細(xì)控制排程
Quartz特點(diǎn)
強(qiáng)大的調(diào)度功能 靈活的應(yīng)用方式 分布式和集群能力
Quartz的設(shè)計(jì)模式
Builder模式 Factory模式 組件模式 鏈?zhǔn)綄懛?/pre>Quartz三個(gè)核心概念
調(diào)度器 任務(wù) 觸發(fā)器Quartz體系結(jié)構(gòu)
JobDetail trigger SimpleTrigger CronTrigger scheduler start stop pause resume示意圖
Quartz重要組成
Job JobDetail JobBuilder JobStore Trigger TriggerBuilder ThreadPool Scheduler Calendar:一個(gè)Trigger可以和多個(gè)Calendar關(guān)聯(lián),以排除或包含某些時(shí)間點(diǎn) 監(jiān)聽器 JobListener TriggerListener SchedulerListener第二章:Quartz詳解 2-1 第一個(gè)Quartz程序準(zhǔn)備工作
建立Maven項(xiàng)目工程 引入Quartz包編寫第一個(gè)Quartz任務(wù)
讓任務(wù)每隔兩秒打印一次hellworld代碼演示
1.編寫任務(wù)類
package com.myimooc.helloquartz.one; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * 編寫 自定義任務(wù) * @author ZhangCheng on 2017-06-26 * */ public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is : " + sf.format(date)); // 編寫具體的業(yè)務(wù)邏輯 System.out.println("Hello World!"); } }2.編寫任務(wù)調(diào)度類
package com.myimooc.helloquartz.one; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** * 編寫 任務(wù)調(diào)度類 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符 .build(); System.out.println("jobDetail"s name : " + jobDeatil.getKey().getName()); System.out.println("jobDetail"s group : " + jobDeatil.getKey().getGroup()); System.out.println("jobDetail"s jobClass : " + jobDeatil.getJobClass().getName()); // 創(chuàng)建一個(gè) Trigger 實(shí)例,定義該 job 立即執(zhí)行,并且每隔兩秒重復(fù)執(zhí)行一次,直到永遠(yuǎn) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符 .startNow()// 定義立即執(zhí)行 .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever())// 定義執(zhí)行頻度 .build(); // 創(chuàng)建 Scheduler 實(shí)例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); // 綁定 JobDetail 和 trigger scheduler.scheduleJob(jobDeatil, trigger); // 執(zhí)行任務(wù) scheduler.start(); // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Time Is : " + sf.format(date)); } }2-2 淺談Job&JobDetailJob定義
實(shí)現(xiàn)業(yè)務(wù)邏輯的任務(wù)接口淺談Job
Job接口非常容易實(shí)現(xiàn),只有一個(gè)execute方法,類似TimerTask的run方法,在里面編寫業(yè)務(wù)邏輯 Job接口源碼 public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }Job實(shí)例在Quartz中的生命周期
每次調(diào)度器執(zhí)行job時(shí),它在調(diào)用execute方法前會(huì)創(chuàng)建一個(gè)新的job實(shí)例 當(dāng)調(diào)用完成后,關(guān)聯(lián)的job對(duì)象實(shí)例會(huì)被釋放,釋放的實(shí)例會(huì)被垃圾回收機(jī)制回收淺談JobDetail
JobDetail為Job實(shí)例提供了許多設(shè)置屬性,以及JobDetailMap成員變量屬性,它用來存儲(chǔ)特定Job實(shí)例的狀態(tài)信息,調(diào)度器需要借助JobDetail對(duì)象來添加Job實(shí)例。JobDetail屬性
name:任務(wù)名稱 group:任務(wù)所屬組 jobClass:任務(wù)實(shí)現(xiàn)類 jobDataMap:傳參的作用2-3 淺談JobExecutionContext&JobDataMap(上)JobExecutionContext是什么
當(dāng)Scheduler調(diào)用一個(gè)Job,就會(huì)將JobExecutionContext傳遞給Job的execute()方法; Job能通過JobExecutionContext對(duì)象訪問到Quartz運(yùn)行時(shí)候的環(huán)境以及Job本身的明細(xì)數(shù)據(jù)。JobDataMap是什么
在進(jìn)行任務(wù)調(diào)度時(shí)JobDataMap存儲(chǔ)在JobExecutionContext中,非常方便獲取 JobDataMap可以用來裝載任務(wù)可序列化的數(shù)據(jù)對(duì)象,當(dāng)job實(shí)例對(duì)象被執(zhí)行時(shí)這些參數(shù)對(duì)象會(huì)傳遞給它 JobDataMap實(shí)現(xiàn)了JDK的Map接口,并且添加了一些非常方便的方法用來存取基本數(shù)據(jù)類型2-4 淺談JobExecutionContext&JobDataMap(下)獲取JobDataMap的兩種方式
從Map中直接獲取 Job實(shí)現(xiàn)類中添加setter方法對(duì)應(yīng)JobDataMap的鍵值 (Quartz框架默認(rèn)的JobFactory實(shí)現(xiàn)類在初始化job實(shí)例對(duì)象時(shí)會(huì)自動(dòng)地調(diào)用這些setter方式)代碼演示
1.HelloScheduler類改造
package com.myimooc.helloquartz.two; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** * 編寫 任務(wù)調(diào)度類 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符 .usingJobData("message", "hello myjob1")// 傳入自定義參數(shù) .usingJobData("floatJobValue", 3.14F)// 傳入自定義參數(shù) .build(); System.out.println("jobDetail"s name : " + jobDeatil.getKey().getName()); System.out.println("jobDetail"s group : " + jobDeatil.getKey().getGroup()); System.out.println("jobDetail"s jobClass : " + jobDeatil.getJobClass().getName()); // 創(chuàng)建一個(gè) Trigger 實(shí)例,定義該 job 立即執(zhí)行,并且每隔兩秒重復(fù)執(zhí)行一次,直到永遠(yuǎn) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符 .usingJobData("message", "hello mytrigger1")// 傳入自定義參數(shù) .usingJobData("doubleTriggerValue", 2.0D)// 傳入自定義參數(shù) .startNow()// 定義立即執(zhí)行 .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever())// 定義執(zhí)行頻度 .build(); // 創(chuàng)建 Scheduler 實(shí)例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); // 綁定 JobDetail 和 trigger scheduler.scheduleJob(jobDeatil, trigger); // 執(zhí)行任務(wù) scheduler.start(); // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Time Is : " + sf.format(date)); } }2.HelloJob類改造
package com.myimooc.helloquartz.two; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.TriggerKey; /** * 編寫 自定義任務(wù) * @author ZhangCheng on 2017-06-26 * */ public class HelloJob implements Job{ // 方式二:getter和setter獲取 // 成員變量 與 傳入?yún)?shù)的key一致 private String message; private Float floatJobValue; private Double doubleTriggerValue; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Float getFloatJobValue() { return floatJobValue; } public void setFloatJobValue(Float floatJobValue) { this.floatJobValue = floatJobValue; } public Double getDoubleTriggerValue() { return doubleTriggerValue; } public void setDoubleTriggerValue(Double doubleTriggerValue) { this.doubleTriggerValue = doubleTriggerValue; } @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is : " + sf.format(date)); // 編寫具體的業(yè)務(wù)邏輯 //System.out.println("Hello World!"); JobKey key = context.getJobDetail().getKey(); System.out.println("My name and group are : " + key.getName() + " : " + key.getGroup()); TriggerKey trkey = context.getTrigger().getKey(); System.out.println("My Trigger name and group are : " + trkey.getName() + " : " + trkey.getGroup()); // 方式一:Map中直接 獲取自定義參數(shù) JobDataMap jdataMap = context.getJobDetail().getJobDataMap(); JobDataMap tdataMap = context.getTrigger().getJobDataMap(); String jobMsg = jdataMap.getString("message"); Float jobFloatValue = jdataMap.getFloat("floatJobValue"); String triMsg = tdataMap.getString("message"); Double triDoubleValue = tdataMap.getDouble("doubleTriggerValue"); System.out.println("jobMsg is : " + jobMsg); System.out.println("jobFloatValue is : " + jobFloatValue); System.out.println("triMsg is : " + triMsg); System.out.println("triDoubleValue is : " + triDoubleValue); // 方式一:Map中直接獲取 獲取自定義參數(shù) JobDataMap jobDataMap = context.getMergedJobDataMap(); jobMsg = jobDataMap.getString("message"); jobFloatValue = jobDataMap.getFloat("floatJobValue"); triMsg = jobDataMap.getString("message"); triDoubleValue = jobDataMap.getDouble("doubleTriggerValue"); System.out.println("jobMsg is : " + jobMsg); System.out.println("jobFloatValue is : " + jobFloatValue); System.out.println("triMsg is : " + triMsg); System.out.println("triDoubleValue is : " + triDoubleValue); // 方式二:getter和setter獲取 System.out.println("message is : " + this.message); System.out.println("jobFloatValue is : " + this.floatJobValue); System.out.println("triDoubleValue is : " + this.doubleTriggerValue); } }2-5 淺談TriggerTrigger是什么
Quartz中的觸發(fā)器用來告訴調(diào)度程序作業(yè)什么時(shí)候觸發(fā) 即Trigger對(duì)象時(shí)用來觸發(fā)執(zhí)行Job的Quartz框架中的Trigger示意圖
觸發(fā)器通用屬性
JobKey:表示job實(shí)例的標(biāo)識(shí),觸發(fā)器被觸發(fā)時(shí),該指定的job實(shí)例會(huì)執(zhí)行 StartTime:表示觸發(fā)器的時(shí)間表首次被觸發(fā)的時(shí)間,它的值的類型是Java.util.Date EndTime:指定觸發(fā)器的不再被觸發(fā)的時(shí)間,它的值的類型是Java.util.Date代碼演示
1.HelloJob類改造
package com.myimooc.helloquartz.three; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.Trigger; /** * 自定義任務(wù) 觸發(fā)器通用屬性 * @author ZhangCheng on 2017-06-26 * */ public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is : " + sf.format(date)); Trigger currentTrigger = context.getTrigger(); System.out.println("Start Time Is : " + sf.format(currentTrigger.getStartTime())); System.out.println("End Time Is : " + sf.format(currentTrigger.getEndTime())); JobKey jobKey = currentTrigger.getJobKey(); System.out.println("JobKey info : " + " jobName : " + jobKey.getName() + " jobGroup : " + jobKey.getGroup()); } }2.HelloScheduler類改造
package com.myimooc.helloquartz.three; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** * 任務(wù)調(diào)度類 觸發(fā)器通用屬性 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Time Is : " + sf.format(date)); // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符 .build(); // 獲取距離當(dāng)前時(shí)間3秒后的時(shí)間 date.setTime(date.getTime() + 3000); // 獲取距離當(dāng)前時(shí)間6秒后的時(shí)間 Date endDate = new Date(); endDate.setTime(endDate.getTime() + 6000); // 創(chuàng)建一個(gè) Trigger 實(shí)例,定義該 job 立即執(zhí)行,并且每隔兩秒重復(fù)執(zhí)行一次,直到永遠(yuǎn) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符 .startAt(date)// 定義3秒后執(zhí)行 .endAt(endDate)// 定義6秒后結(jié)束 .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever())// 定義執(zhí)行頻度 .build(); // 創(chuàng)建 Scheduler 實(shí)例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); // 綁定 JobDetail 和 trigger scheduler.scheduleJob(jobDeatil, trigger); // 執(zhí)行任務(wù) scheduler.start(); } }2-6 SimpleTriggerSimpleTrigger的作用
在一個(gè)指定時(shí)間段內(nèi)執(zhí)行一次作業(yè)任務(wù) 或是在指定的時(shí)間間隔內(nèi)多次執(zhí)行作業(yè)任務(wù)需要注意的點(diǎn)
重復(fù)次數(shù)可以為0,正整數(shù)或是SimpleTrigger.REPEAT_INDEFINITELY常量值 重復(fù)執(zhí)行間隔必須為0或長(zhǎng)整數(shù) 一旦被指定了endTime參數(shù),那么它會(huì)覆蓋重復(fù)次數(shù)參數(shù)的效果代碼演示
1.HelloJob類改造
package com.myimooc.helloquartz.four; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * SimpleTrigger 演示 * @author ZhangCheng on 2017-06-26 * */ public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time Is : " + sf.format(date)); System.out.println("Hello World!"); } }2.HelloScheduler類改造
package com.myimooc.helloquartz.four; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** * SimpleTrigger 演示 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Time Is : " + sf.format(date)); // 創(chuàng)建一個(gè) JobDetail 實(shí)例,將該實(shí)例與 HelloJob 實(shí)例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標(biāo)識(shí)符 .build(); // 獲取距離當(dāng)前時(shí)間4秒鐘之后的具體時(shí)間 date.setTime(date.getTime() + 4000); // 獲取距離當(dāng)前時(shí)間6秒鐘之后的具體時(shí)間 Date endDate = new Date(); endDate.setTime(endDate.getTime() + 6000); // 距離當(dāng)前時(shí)間4秒鐘后首次執(zhí)行任務(wù),之后每隔2秒鐘重復(fù)執(zhí)行一次任務(wù) // 知道距離當(dāng)前時(shí)間6秒鐘之后為止 SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder .newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標(biāo)識(shí)符 .startAt(date) .endAt(endDate) .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)) .build(); // 創(chuàng)建 Scheduler 實(shí)例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.scheduleJob(jobDeatil, trigger); scheduler.start(); } }2-7 CronTriggerCronTrigger的作用
基于日歷的作業(yè)調(diào)度器,而不是像SimpleTrigger那樣精確指定間隔時(shí)間,比SimpleTrigger更常用Cron表達(dá)式
用于配置CronTrigger實(shí)例 是由7個(gè)子表達(dá)式組成的字符串,描述了時(shí)間表的詳細(xì)信息 格式:[秒][分][小時(shí)][日][月][周][年]Cron表達(dá)式特殊字符意義對(duì)應(yīng)表
特殊符號(hào)解釋
Cron表達(dá)式舉例
Cron表達(dá)式小提示
L和W可以一組合使用 周字段英文字母不區(qū)分大小寫即MON與mon相同 利用工具,在線生成2-8 淺談SchedulerScheduler工廠模式
所有的Scheduler實(shí)例應(yīng)該由SchedulerFactory來創(chuàng)建SchedulerFactory類圖
回顧Quartz三個(gè)核心概念
調(diào)度器 任務(wù) 觸發(fā)器示意圖
Scheduler的創(chuàng)建方式
StdSchedulerFactory
使用一組參數(shù)(Java.util.Properties)來創(chuàng)建和初始化Quartz調(diào)度器 配置參數(shù)一般存儲(chǔ)在quartz.properties中 調(diào)用getScheduler方法就能創(chuàng)建和初始化調(diào)度器對(duì)象Scheduler的主要函數(shù)
// 綁定 jobDetail 和 trigger,將它注冊(cè)進(jìn) Scheduler 當(dāng)中 Date scheduleJob(JobDetail jobDetail, Trigger trigger) // 啟動(dòng) Scheduler void start() // 暫停 Scheduler void standby() // 關(guān)閉 Scheduler void shutdown()2-9 QuartzProperties文件quartz.properties組成部分
調(diào)度器屬性 線程池屬性 作業(yè)存儲(chǔ)設(shè)置 插件配置調(diào)度器屬性
線程池屬性
threadCount:工作線程數(shù)量 threadPriority:工作線程優(yōu)先級(jí) org.quartz.threadPool.class:配置線程池實(shí)現(xiàn)類作業(yè)存儲(chǔ)設(shè)置
描述了在調(diào)度器實(shí)例的生命周期中,Job和Trigger信息是如何被存儲(chǔ)的插件配置
滿足特定需求用到的Quartz插件的配置第三章:Spring、Quartz大合體 3-1 搭建工程基于Maven創(chuàng)建一個(gè)簡(jiǎn)單的SpringMVC工程,學(xué)習(xí)時(shí),使用springboot框架。
項(xiàng)目POM文件
4.0.0 com.myimooc springquartz 0.0.1-SNAPSHOT jar springquartz http://maven.apache.org org.springframework.boot spring-boot-starter-parent 1.5.1.RELEASE UTF-8 UTF-8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework spring-context-support org.springframework spring-tx org.springframework.boot spring-boot-starter-freemarker org.quartz-scheduler quartz 2.3.0 junit junit test org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 項(xiàng)目目錄結(jié)構(gòu)
3-2 Quartz和Spring大合體使用Quartz配置作業(yè)兩種方式
MethodInvokingJobDetailFactoryBean JobDetailFactoryBean方式一:使用MethodInvokingJobDetailFactoryBean
1.調(diào)用myBean的printMessage方法
2.MyBean類
方式二:使用JobDetailFactoryBean
1.需要給作業(yè)傳遞數(shù)據(jù),想要更加靈活的話就是用這種方式
2.FirstScheduleJob類
3.AnotherBean類
代碼演示:
演示說明:教學(xué)基于xml進(jìn)行配置,學(xué)習(xí)時(shí)基于javaconfig進(jìn)行配置。
1.編寫MyBean類
package com.myimooc.springquartz.quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.stereotype.Component; /** * 方式一:使用MethodInvokingJobDetailFactoryBean 演示 * @author ZhangCheng on 2017-06-28 * */ @Component public class MyBean { public void printMessage(){ // 打印當(dāng)前的執(zhí)行時(shí)間,格式為2017-01-01 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("MyBean Executes!" + sf.format(date)); } }2.編寫AnotherBean類
package com.myimooc.springquartz.quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.stereotype.Component; /** * 方式二:使用JobDetailFactoryBean 演示 * @author ZhangCheng on 2017-06-28 * */ @Component public class AnotherBean { public void printAnotherMessage(){ Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("I am AnotherBean." + sf.format(date)); } }3.編寫FirstScheduledJob類
package com.myimooc.springquartz.quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; /** * 方式二:使用JobDetailFactoryBean 演示 * @author ZhangCheng on 2017-06-28 * */ public class FirstScheduledJob extends QuartzJobBean { private AnotherBean anotherBean; public void setAnotherBean(AnotherBean anotherBean) { this.anotherBean = anotherBean; } @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("FirstScheduledJob Excutes!" + sf.format(date)); this.anotherBean.printAnotherMessage(); } }4.編寫QuartzConfig類
package com.myimooc.springquartz.config; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.JobDetailFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean; import com.myimooc.springquartz.quartz.AnotherBean; import com.myimooc.springquartz.quartz.FirstScheduledJob; import com.myimooc.springquartz.quartz.MyBean; /** * Quartz 配置類 * @author ZhangCheng on 2017-06-28 * */ @Configuration public class QuartzConfig { @Autowired private MyBean myBean; @Autowired private AnotherBean anotherBean; /** * 方式一:使用MethodInvokingJobDetailFactoryBean * @return */ @Bean public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){ MethodInvokingJobDetailFactoryBean mb = new MethodInvokingJobDetailFactoryBean(); mb.setTargetObject(myBean);// 指定要運(yùn)行的類 mb.setTargetMethod("printMessage");// 指定要允許類中的那個(gè)方法 return mb; } /** * 方式二:使用JobDetailFactoryBean * @return */ @Bean public JobDetailFactoryBean jobDetailFactoryBean(){ JobDetailFactoryBean jb= new JobDetailFactoryBean(); jb.setJobClass(FirstScheduledJob.class);// 指定要運(yùn)行的類 JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("anotherBean", anotherBean); jb.setJobDataMap(jobDataMap);// 設(shè)置傳入自定義參數(shù) jb.setDurability(true); return jb; } /** * 配置 SimpleTriggerFactoryBean * @return */ @Bean public SimpleTriggerFactoryBean simpleTriggerFactoryBean(){ SimpleTriggerFactoryBean sb = new SimpleTriggerFactoryBean(); sb.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());// 設(shè)置需要綁定的 jobDetail sb.setStartDelay(1000L);// 距離當(dāng)前時(shí)間1秒后執(zhí)行 sb.setRepeatInterval(2000L);// 之后每隔2秒執(zhí)行一次 return sb; } /** * 配置 SimpleTriggerFactoryBean * @return */ @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(){ CronTriggerFactoryBean cb = new CronTriggerFactoryBean(); cb.setJobDetail(jobDetailFactoryBean().getObject());// 設(shè)置需要綁定的 jobDetail cb.setStartDelay(1000L);// 距離當(dāng)前時(shí)間1秒后執(zhí)行 cb.setCronExpression("0/5 * * ? * *");// 設(shè)置 Cron 表達(dá)式,之后每隔5秒執(zhí)行一次 return cb; } /** * 配置 SchedulerFactoryBean * @return */ @Bean public SchedulerFactoryBean schedulerFactoryBean(){ SchedulerFactoryBean sb= new SchedulerFactoryBean(); // 配置 JobDetails JobDetail[] jobDetails = new JobDetail[2]; jobDetails[0] = methodInvokingJobDetailFactoryBean().getObject(); jobDetails[1] = jobDetailFactoryBean().getObject(); sb.setJobDetails(jobDetails); // 配置 Trigger Trigger[] triggers = new Trigger[2]; triggers[0] = simpleTriggerFactoryBean().getObject(); triggers[1] = cronTriggerFactoryBean().getObject(); sb.setTriggers(triggers); return sb; } }第四章:課程總結(jié) 4-1 課程總結(jié)課程回顧
Timer Quartz Quartz&Spring融合
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67241.html
時(shí)間:2017年05月24日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時(shí)任務(wù)調(diào)度 基于給定的時(shí)間點(diǎn),給定的時(shí)間間隔或者給定的執(zhí)行次數(shù)自動(dòng)執(zhí)行的任務(wù) 在Java中的定時(shí)調(diào)度工具 Timer:小弟,能實(shí)現(xiàn)日常60%的定...
摘要:坦克大戰(zhàn)上簡(jiǎn)介上的坦克大戰(zhàn)相信大家都玩過有逃學(xué)玩坦克的可以自己默默的扣一個(gè)了我們現(xiàn)在長(zhǎng)大了,學(xué)習(xí)游戲開發(fā)了。 寫在前面 上一篇(https://www.tech1024.cn/origi... )說了如何創(chuàng)建項(xiàng)目,并爬去網(wǎng)站內(nèi)容,下面我們說一下如何保存爬去到的數(shù)據(jù) 開始爬取 創(chuàng)建Spider,上一篇我們已經(jīng)創(chuàng)建了ImoocSpider,我們做一下修改,可以連續(xù)下一頁爬取。scrapyD...
時(shí)間:2017年10月16日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程簡(jiǎn)介 1-1 課程介紹 本門課程的主要內(nèi)容 RxJava是什么 RxAndroid是什么 RxJava常用操作符(重點(diǎn)、難點(diǎn)) 怎樣在項(xiàng)目中使用RxJava和RxAndroid 如何學(xué)...
摘要:慕課網(wǎng)消息中間件極速入門與實(shí)戰(zhàn)學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《RabbitMQ消息中間件極速入門與實(shí)戰(zhàn)》學(xué)習(xí)總結(jié) 時(shí)間:2018年09月05日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:RabbitM...
摘要:通過再添加其他的元素可在中放置多個(gè)觸發(fā)器。停止觸發(fā)器重啟觸發(fā)器停止觸發(fā)器移除觸發(fā)器添加調(diào)度的任務(wù)類調(diào)度的任務(wù)。執(zhí)行的張表入數(shù)據(jù)庫添加啟動(dòng)類簡(jiǎn)單微服務(wù),支持集群分布式,并支持動(dòng)態(tài)修改任務(wù)的執(zhí)行時(shí)間。 SpringCloud(第 010 篇)簡(jiǎn)單 Quartz-Cluster 微服務(wù),支持集群分布式,并支持動(dòng)態(tài)修改 Quartz 任務(wù)的 cronExpression 執(zhí)行時(shí)間 - 一、大致...
閱讀 1694·2021-11-22 13:52
閱讀 1552·2021-09-29 09:34
閱讀 2908·2021-09-09 11:40
閱讀 3122·2019-08-30 15:54
閱讀 1352·2019-08-30 15:53
閱讀 1056·2019-08-30 11:01
閱讀 1487·2019-08-29 17:22
閱讀 2048·2019-08-26 10:57