摘要:時間年月日星期一說明本文部分內(nèi)容均來自慕課網(wǎng)。屬性任務名稱任務所屬組任務實現(xiàn)類傳參的作用淺談上是什么當調(diào)用一個,就會將傳遞給的方法能通過對象訪問到運行時候的環(huán)境以及本身的明細數(shù)據(jù)。
時間:2017年06月26日星期一
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學示例源碼:https://github.com/zccodere/s...
個人學習源碼:https://github.com/zccodere/s...
Quartz概要
OpenSymphony提供的強大的開源任務調(diào)度框架 官網(wǎng):http://www.quartz-scheduler.org 純Java實現(xiàn),精細控制排程
Quartz特點
強大的調(diào)度功能 靈活的應用方式 分布式和集群能力
Quartz的設計模式
Builder模式 Factory模式 組件模式 鏈式寫法
Quartz三個核心概念
調(diào)度器 任務 觸發(fā)器
Quartz體系結構
JobDetail trigger SimpleTrigger CronTrigger scheduler start stop pause resume
示意圖
Quartz重要組成
Job JobDetail JobBuilder JobStore Trigger TriggerBuilder ThreadPool Scheduler Calendar:一個Trigger可以和多個Calendar關聯(lián),以排除或包含某些時間點 監(jiān)聽器 JobListener TriggerListener SchedulerListener第二章:Quartz詳解 2-1 第一個Quartz程序
準備工作
建立Maven項目工程 引入Quartz包
編寫第一個Quartz任務
讓任務每隔兩秒打印一次hellworld
代碼演示
1.編寫任務類
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; /** * 編寫 自定義任務 * @author ZhangCheng on 2017-06-26 * */ public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印當前的執(zhí)行時間,格式為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è)務邏輯 System.out.println("Hello World!"); } }
2.編寫任務調(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; /** * 編寫 任務調(diào)度類 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 創(chuàng)建一個 JobDetail 實例,將該實例與 HelloJob 實例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標識符 .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)建一個 Trigger 實例,定義該 job 立即執(zhí)行,并且每隔兩秒重復執(zhí)行一次,直到永遠 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標識符 .startNow()// 定義立即執(zhí)行 .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever())// 定義執(zhí)行頻度 .build(); // 創(chuàng)建 Scheduler 實例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); // 綁定 JobDetail 和 trigger scheduler.scheduleJob(jobDeatil, trigger); // 執(zhí)行任務 scheduler.start(); // 打印當前的執(zhí)行時間,格式為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&JobDetail
Job定義
實現(xiàn)業(yè)務邏輯的任務接口
淺談Job
Job接口非常容易實現(xiàn),只有一個execute方法,類似TimerTask的run方法,在里面編寫業(yè)務邏輯 Job接口源碼 public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
Job實例在Quartz中的生命周期
每次調(diào)度器執(zhí)行job時,它在調(diào)用execute方法前會創(chuàng)建一個新的job實例 當調(diào)用完成后,關聯(lián)的job對象實例會被釋放,釋放的實例會被垃圾回收機制回收
淺談JobDetail
JobDetail為Job實例提供了許多設置屬性,以及JobDetailMap成員變量屬性,它用來存儲特定Job實例的狀態(tài)信息,調(diào)度器需要借助JobDetail對象來添加Job實例。
JobDetail屬性
name:任務名稱 group:任務所屬組 jobClass:任務實現(xiàn)類 jobDataMap:傳參的作用2-3 淺談JobExecutionContext&JobDataMap(上)
JobExecutionContext是什么
當Scheduler調(diào)用一個Job,就會將JobExecutionContext傳遞給Job的execute()方法; Job能通過JobExecutionContext對象訪問到Quartz運行時候的環(huán)境以及Job本身的明細數(shù)據(jù)。
JobDataMap是什么
在進行任務調(diào)度時JobDataMap存儲在JobExecutionContext中,非常方便獲取 JobDataMap可以用來裝載任務可序列化的數(shù)據(jù)對象,當job實例對象被執(zhí)行時這些參數(shù)對象會傳遞給它 JobDataMap實現(xiàn)了JDK的Map接口,并且添加了一些非常方便的方法用來存取基本數(shù)據(jù)類型2-4 淺談JobExecutionContext&JobDataMap(下)
獲取JobDataMap的兩種方式
從Map中直接獲取 Job實現(xiàn)類中添加setter方法對應JobDataMap的鍵值 (Quartz框架默認的JobFactory實現(xiàn)類在初始化job實例對象時會自動地調(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; /** * 編寫 任務調(diào)度類 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 創(chuàng)建一個 JobDetail 實例,將該實例與 HelloJob 實例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標識符 .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)建一個 Trigger 實例,定義該 job 立即執(zhí)行,并且每隔兩秒重復執(zhí)行一次,直到永遠 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標識符 .usingJobData("message", "hello mytrigger1")// 傳入自定義參數(shù) .usingJobData("doubleTriggerValue", 2.0D)// 傳入自定義參數(shù) .startNow()// 定義立即執(zhí)行 .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever())// 定義執(zhí)行頻度 .build(); // 創(chuàng)建 Scheduler 實例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); // 綁定 JobDetail 和 trigger scheduler.scheduleJob(jobDeatil, trigger); // 執(zhí)行任務 scheduler.start(); // 打印當前的執(zhí)行時間,格式為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; /** * 編寫 自定義任務 * @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 { // 打印當前的執(zhí)行時間,格式為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è)務邏輯 //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 淺談Trigger
Trigger是什么
Quartz中的觸發(fā)器用來告訴調(diào)度程序作業(yè)什么時候觸發(fā) 即Trigger對象時用來觸發(fā)執(zhí)行Job的
Quartz框架中的Trigger示意圖
觸發(fā)器通用屬性
JobKey:表示job實例的標識,觸發(fā)器被觸發(fā)時,該指定的job實例會執(zhí)行 StartTime:表示觸發(fā)器的時間表首次被觸發(fā)的時間,它的值的類型是Java.util.Date EndTime:指定觸發(fā)器的不再被觸發(fā)的時間,它的值的類型是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; /** * 自定義任務 觸發(fā)器通用屬性 * @author ZhangCheng on 2017-06-26 * */ public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 打印當前的執(zhí)行時間,格式為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; /** * 任務調(diào)度類 觸發(fā)器通用屬性 * @author ZhangCheng on 2017-06-26 * */ public class HelloScheduler { public static void main(String[] args) throws SchedulerException { // 打印當前的執(zhí)行時間,格式為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)建一個 JobDetail 實例,將該實例與 HelloJob 實例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標識符 .build(); // 獲取距離當前時間3秒后的時間 date.setTime(date.getTime() + 3000); // 獲取距離當前時間6秒后的時間 Date endDate = new Date(); endDate.setTime(endDate.getTime() + 6000); // 創(chuàng)建一個 Trigger 實例,定義該 job 立即執(zhí)行,并且每隔兩秒重復執(zhí)行一次,直到永遠 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標識符 .startAt(date)// 定義3秒后執(zhí)行 .endAt(endDate)// 定義6秒后結束 .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever())// 定義執(zhí)行頻度 .build(); // 創(chuàng)建 Scheduler 實例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); // 綁定 JobDetail 和 trigger scheduler.scheduleJob(jobDeatil, trigger); // 執(zhí)行任務 scheduler.start(); } }2-6 SimpleTrigger
SimpleTrigger的作用
在一個指定時間段內(nèi)執(zhí)行一次作業(yè)任務 或是在指定的時間間隔內(nèi)多次執(zhí)行作業(yè)任務
需要注意的點
重復次數(shù)可以為0,正整數(shù)或是SimpleTrigger.REPEAT_INDEFINITELY常量值 重復執(zhí)行間隔必須為0或長整數(shù) 一旦被指定了endTime參數(shù),那么它會覆蓋重復次數(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 { // 打印當前的執(zhí)行時間,格式為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 { // 打印當前的執(zhí)行時間,格式為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)建一個 JobDetail 實例,將該實例與 HelloJob 實例綁定 JobDetail jobDeatil = JobBuilder.newJob(HelloJob.class) .withIdentity("myjob", "jobgroup1")// 定義標識符 .build(); // 獲取距離當前時間4秒鐘之后的具體時間 date.setTime(date.getTime() + 4000); // 獲取距離當前時間6秒鐘之后的具體時間 Date endDate = new Date(); endDate.setTime(endDate.getTime() + 6000); // 距離當前時間4秒鐘后首次執(zhí)行任務,之后每隔2秒鐘重復執(zhí)行一次任務 // 知道距離當前時間6秒鐘之后為止 SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder .newTrigger() .withIdentity("myTrigger","trigroup1")// 定義標識符 .startAt(date) .endAt(endDate) .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)) .build(); // 創(chuàng)建 Scheduler 實例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.scheduleJob(jobDeatil, trigger); scheduler.start(); } }2-7 CronTrigger
CronTrigger的作用
基于日歷的作業(yè)調(diào)度器,而不是像SimpleTrigger那樣精確指定間隔時間,比SimpleTrigger更常用
Cron表達式
用于配置CronTrigger實例 是由7個子表達式組成的字符串,描述了時間表的詳細信息 格式:[秒][分][小時][日][月][周][年]
Cron表達式特殊字符意義對應表
特殊符號解釋
Cron表達式舉例
Cron表達式小提示
L和W可以一組合使用 周字段英文字母不區(qū)分大小寫即MON與mon相同 利用工具,在線生成2-8 淺談Scheduler
Scheduler工廠模式
所有的Scheduler實例應該由SchedulerFactory來創(chuàng)建
SchedulerFactory類圖
回顧Quartz三個核心概念
調(diào)度器 任務 觸發(fā)器
示意圖
Scheduler的創(chuàng)建方式
StdSchedulerFactory
使用一組參數(shù)(Java.util.Properties)來創(chuàng)建和初始化Quartz調(diào)度器 配置參數(shù)一般存儲在quartz.properties中 調(diào)用getScheduler方法就能創(chuàng)建和初始化調(diào)度器對象
Scheduler的主要函數(shù)
// 綁定 jobDetail 和 trigger,將它注冊進 Scheduler 當中 Date scheduleJob(JobDetail jobDetail, Trigger trigger) // 啟動 Scheduler void start() // 暫停 Scheduler void standby() // 關閉 Scheduler void shutdown()2-9 QuartzProperties文件
quartz.properties組成部分
調(diào)度器屬性 線程池屬性 作業(yè)存儲設置 插件配置
調(diào)度器屬性
線程池屬性
threadCount:工作線程數(shù)量 threadPriority:工作線程優(yōu)先級 org.quartz.threadPool.class:配置線程池實現(xiàn)類
作業(yè)存儲設置
描述了在調(diào)度器實例的生命周期中,Job和Trigger信息是如何被存儲的
插件配置
滿足特定需求用到的Quartz插件的配置第三章:Spring、Quartz大合體 3-1 搭建工程
基于Maven創(chuàng)建一個簡單的SpringMVC工程,學習時,使用springboot框架。
項目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
項目目錄結構
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類
代碼演示:
演示說明:教學基于xml進行配置,學習時基于javaconfig進行配置。
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(){ // 打印當前的執(zhí)行時間,格式為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);// 指定要運行的類 mb.setTargetMethod("printMessage");// 指定要允許類中的那個方法 return mb; } /** * 方式二:使用JobDetailFactoryBean * @return */ @Bean public JobDetailFactoryBean jobDetailFactoryBean(){ JobDetailFactoryBean jb= new JobDetailFactoryBean(); jb.setJobClass(FirstScheduledJob.class);// 指定要運行的類 JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("anotherBean", anotherBean); jb.setJobDataMap(jobDataMap);// 設置傳入自定義參數(shù) jb.setDurability(true); return jb; } /** * 配置 SimpleTriggerFactoryBean * @return */ @Bean public SimpleTriggerFactoryBean simpleTriggerFactoryBean(){ SimpleTriggerFactoryBean sb = new SimpleTriggerFactoryBean(); sb.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());// 設置需要綁定的 jobDetail sb.setStartDelay(1000L);// 距離當前時間1秒后執(zhí)行 sb.setRepeatInterval(2000L);// 之后每隔2秒執(zhí)行一次 return sb; } /** * 配置 SimpleTriggerFactoryBean * @return */ @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(){ CronTriggerFactoryBean cb = new CronTriggerFactoryBean(); cb.setJobDetail(jobDetailFactoryBean().getObject());// 設置需要綁定的 jobDetail cb.setStartDelay(1000L);// 距離當前時間1秒后執(zhí)行 cb.setCronExpression("0/5 * * ? * *");// 設置 Cron 表達式,之后每隔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; } }第四章:課程總結 4-1 課程總結
課程回顧
Timer Quartz Quartz&Spring融合
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/67241.html
時間:2017年05月24日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學示例源碼:無個人學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時任務調(diào)度 基于給定的時間點,給定的時間間隔或者給定的執(zhí)行次數(shù)自動執(zhí)行的任務 在Java中的定時調(diào)度工具 Timer:小弟,能實現(xiàn)日常60%的定...
摘要:坦克大戰(zhàn)上簡介上的坦克大戰(zhàn)相信大家都玩過有逃學玩坦克的可以自己默默的扣一個了我們現(xiàn)在長大了,學習游戲開發(fā)了。 寫在前面 上一篇(https://www.tech1024.cn/origi... )說了如何創(chuàng)建項目,并爬去網(wǎng)站內(nèi)容,下面我們說一下如何保存爬去到的數(shù)據(jù) 開始爬取 創(chuàng)建Spider,上一篇我們已經(jīng)創(chuàng)建了ImoocSpider,我們做一下修改,可以連續(xù)下一頁爬取。scrapyD...
時間:2017年10月16日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程簡介 1-1 課程介紹 本門課程的主要內(nèi)容 RxJava是什么 RxAndroid是什么 RxJava常用操作符(重點、難點) 怎樣在項目中使用RxJava和RxAndroid 如何學...
摘要:慕課網(wǎng)消息中間件極速入門與實戰(zhàn)學習總結時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《RabbitMQ消息中間件極速入門與實戰(zhàn)》學習總結 時間:2018年09月05日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學源碼:無 學習源碼:https://github.com/zccodere/s... 第一章:RabbitM...
摘要:通過再添加其他的元素可在中放置多個觸發(fā)器。停止觸發(fā)器重啟觸發(fā)器停止觸發(fā)器移除觸發(fā)器添加調(diào)度的任務類調(diào)度的任務。執(zhí)行的張表入數(shù)據(jù)庫添加啟動類簡單微服務,支持集群分布式,并支持動態(tài)修改任務的執(zhí)行時間。 SpringCloud(第 010 篇)簡單 Quartz-Cluster 微服務,支持集群分布式,并支持動態(tài)修改 Quartz 任務的 cronExpression 執(zhí)行時間 - 一、大致...
閱讀 1516·2021-11-22 13:52
閱讀 1329·2021-09-29 09:34
閱讀 2727·2021-09-09 11:40
閱讀 3044·2019-08-30 15:54
閱讀 1273·2019-08-30 15:53
閱讀 984·2019-08-30 11:01
閱讀 1372·2019-08-29 17:22
閱讀 1966·2019-08-26 10:57