spring任务调度方法之Quartz
一、Quartz简介
Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。
Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。
二、Quartz任务调度
1. 简单任务调度
在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。
HelloWorldJob.java
package com.learnworld.quartz;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public class HelloWorldJob implements Job {public void execute(JobExecutionContext context) throws JobExecutionException { //实现你的业务逻辑System.out.println("Hello!");}}package com.learnworld.quartz;import java.util.Date;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SimpleTrigger;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;public class HelloScheduling {public static void main(String[] args) throws Exception {Scheduler scheduler = new StdSchedulerFactory().getScheduler();scheduler.start();JobDetail jobDetail = new JobDetail("helloWorldJob",Scheduler.DEFAULT_GROUP, HelloWorldJob.class);Trigger trigger = new SimpleTrigger("simpleTrigger",Scheduler.DEFAULT_GROUP, new Date(), null,SimpleTrigger.REPEAT_INDEFINITELY, 1000);scheduler.scheduleJob(jobDetail, trigger);}}package com.learnworld.quartz;import java.util.Map;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public class MessageJob implements Job {public void execute(JobExecutionContext context) throws JobExecutionException {Map properties = context.getJobDetail().getJobDataMap();System.out.println("Previous Fire Time: " + context.getPreviousFireTime());System.out.println("Current Fire Time: " + context.getFireTime());System.out.println("Next Fire Time: " + context.getNextFireTime());System.out.println(properties.get("message"));}}package com.learnworld.quartz;import java.util.Date;import java.util.Map;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SimpleTrigger;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;public class MessageScheduling {public static void main(String[] args) throws Exception {Scheduler scheduler = new StdSchedulerFactory().getScheduler();scheduler.start();JobDetail jobDetail = new JobDetail("messageJob",Scheduler.DEFAULT_GROUP, MessageJob.class);Map map = jobDetail.getJobDataMap();map.put("message", "This is a message from Quartz");Trigger trigger = new SimpleTrigger("simpleTrigger",Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),SimpleTrigger.REPEAT_INDEFINITELY, 5000);scheduler.scheduleJob(jobDetail, trigger);}}package com.learnworld.quartz;import java.util.Calendar;import java.util.Date;import java.util.Map;import org.quartz.CronTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SimpleTrigger;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;import org.quartz.impl.calendar.HolidayCalendar;public class CronWithCalendarScheduling {public static void main(String[] args) throws Exception {Calendar cal = Calendar.getInstance();cal.set(2010, Calendar.OCTOBER, 31);HolidayCalendar calendar = new HolidayCalendar();calendar.addExcludedDate(cal.getTime());Scheduler scheduler = new StdSchedulerFactory().getScheduler();scheduler.start();scheduler.addCalendar("calendar", calendar, true, false);JobDetail jobDetail = new JobDetail("messageJob",Scheduler.DEFAULT_GROUP, MessageJob.class);Map map = jobDetail.getJobDataMap();map.put("message", "This is a message from Quartz");String cronExpression = "3/5 * 17,18,19,20 * * ?";Trigger trigger = new CronTrigger("cronTrigger",Scheduler.DEFAULT_GROUP, cronExpression);scheduler.scheduleJob(jobDetail, trigger);}}<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><bean id="job"/></property></bean><bean id="schdulerFactory" /></list></property></bean></beans>
package com.learnworld.quartz;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class SimpleSpringQuartzIntegration {public static void main(String[] args) {ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");}}<property name="workbroker" jobid="workbroker"action="org.frameworkset.task.TestJob"cronb_time="0 56 14 * * ?" used="true"><map><property name="send_count" value="2" /></map></property>
public class TestJob implements Execute, Serializable {public void execute(Map parameters) {System.out.println("send_count = "+parameters.get("send_count"));}} 3 楼 sarin 2010-11-03 可以参考一下 4 楼 yuhe 2010-11-04 谢楼主,不过楼主可以分享下 动态设置 经验。