Quartz是一個定時任務調度的框架,在預約的時間到達時,執行某一任務spring
可認爲是JDK的Timer類的擴展app
Quartz的核心接口
Scheduler – 核心調度器
Job – 任務
JobDetail – 任務描述
Trigger -- 觸發器
SimpleTrigger只執行一次或在給定時間觸發並重復N次
CronTriggers:像日曆那樣按日程來觸發任務, 使用cron表達式框架
代碼示例ide
public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello world"); } }
public class QuartzExample { public void run() throws Exception { // 調度器 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); // 獲取當前時間的下一分鐘 Date runTime = evenMinuteDate(new Date()); // 定義job // 在quartz中,有組的概念,withIdentity(名稱, 組) JobDetail job = newJob(MyJob.class).withIdentity("job1", "group1").build(); // 定義觸發器,每2秒執行一次 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0 0/1 * * * ?")).build(); // 定義觸發器,在下一分鐘啓動 // Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); // 將job註冊到調度器 sched.scheduleJob(job, trigger); // 啓動調度器 sched.start(); // 模擬handling Thread.sleep(60L * 1000L); // 關閉調度器 sched.shutdown(true); } public static void main(String[] args) throws Exception { QuartzExample example = new QuartzExample(); example.run(); } }
進一步的用法是與Spring整合ui
public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("myJob 執行了............." + context.getTrigger().getKey().getName()); // get("applicationContext")參數是spring配置中applicationContextJobDataKey屬性的值, 做爲jobmap的key. 這條語句拿到spring容器 ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap().get("applicationContext"); System.out.println("獲取到的Spring容器是: " + applicationContext); } }
// 實例化spring容器
public class Main { public static void main(String[] args) { new ClassPathXmlApplicationContext("classpath:applicationContext-scheduler.xml"); } }
spring配置文件spa
<!-- 定義jobDetail --> <bean id ="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 指定具體的job類 --> <property name ="jobClass" value="com.zx.quartz.MyJob" /> <!-- 指定job的名稱 --> <property name="name" value="myJob" /> <!-- 指定job的分組 --> <property name="group" value="jobs" /> <!-- 必須設置爲true,若是爲false,當沒有活動的觸發器與之關聯時會在調度器中刪除該任務 --> <property name="durability" value="true"/> <!-- 指定spring容器的key,若是不設定那麼在job類中是獲取不到spring容器裏的對象的 --> <property name="applicationContextJobDataKey" value="applicationContext"/> </bean> <!-- 另外一種方式, 定義job和jobDetial, Job類爲普通類便可 <!-- 配置job -- <bean id="myJob" class="com.zx.quartz.MyJob"/> <!-- 配置jobDetail -- <bean id="myJobDetial" class="org.springframework.scheduling.quartz.MethodlnvokingJobDetaiLFactoryBean"> <property name="targetObject"> <ref bean="myJob" /> </property> <property name="targetMethod"> <!-- 要執行的方法名 -- <value>execute</value> </property> </bean> --> <!-- 定義觸發器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="myJobDetail" /> <!-- 每五秒執行一次 --> <property name="cronExpression" value="0/5 * * * * ?" /> </bean> <!-- 定義觸發器, 一個job能夠有多個trigger, 但一個trigger只能有一個job --> <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="myJobDetail" /> <!-- 每一分鐘執行一次 --> <property name="cronExpression" value="0 */1 * * * ?" /> </bean> <!-- 定義調度器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> <ref bean="cronTrigger2" /> </list> </property> </bean>