Quartz是很常用的定时器组建包。
一 quartz简单使用
1. 任务job类 SimpleJob.java
package quartz.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SimpleJob implements Job{
private static int count=0;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
count++;
System.out.println("Now the count is "+count+".");
}
public void execute(){
count++;
System.out.println("Now the count is "+count+".");
}
}
Note:SimpleJob中有2个execute方法。带参数的是用于非Spring整合时调用的,不带参数的是用于与Spring整合时调用的。 【PS:可以通过类型添加类型转换器直接调用带参数的那个execute】
2. 定时器工具类 LocalScheduler.java 类
package quartz.traditional;
import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class LocalScheduler {
private static SchedulerFactory sf = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "group1";
private static String TRIGGER_GROUP_NAME = "trigger1";
/**
* 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
* @param jobName 任务名
* @param job 任务
* @param time 时间设置,发考quartz说明文档
* @throws SchedulerException
* @throws ParseException
* @throws java.text.ParseException
*/
@SuppressWarnings("rawtypes")
public static void addJob(String jobName, Class jobClass, String time)
throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
// 触发器任务
JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME,jobClass);// 任务,任务组,任务执行类
// 触发器时间设定
CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组名
trigger.setCronExpression(time);
// 发动
sched.scheduleJob(jobDetail, trigger);
if (!sched.isShutdown())
sched.start();
}
/**
* 修改一个定时任务,使用默认的任务组名,触发器名,触发器组名
* @param jobName
* @param time
* @throws SchedulerException
* @throws ParseException
*/
@SuppressWarnings("rawtypes")
public static void modifyJobTime(String jobName,Class jobClass, String time)
throws SchedulerException, ParseException {
removeJob(jobName);
addJob(jobName,jobClass,time);
}
/**
* 移除一个定时任务,使用默认的任务组名,触发器名,触发�器组名
* @param jobName
* @throws SchedulerException
*/
public static void removeJob(String jobName) throws SchedulerException {
Scheduler sched = sf.getScheduler();
sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 暂发触发器
sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
}
/**
* 关闭定时
* @throws SchedulerException
*/
public static void stop() throws SchedulerException{
sf.getScheduler().shutdown();
}
}
3. 测试类 Main.java
package quartz.traditional;
import quartz.job.SimpleJob;
public class Main {
public static void main(String[] args) throws Exception {
// 启动一个任务
LocalScheduler.addJob("simpleJob", SimpleJob.class, "0/1 * * * * ?");
// 修改任务执行时间间隔
LocalScheduler.modifyJobTime("simpleJob",SimpleJob.class,"0/10 * * * * ?");
// 移除任务
LocalScheduler.removeJob("simpleJob");
// 关闭定时器
LocalScheduler.stop();
}
}
二 Spring整合quartz
1. Spring配置文件quartz.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- ==================== quartz ==================== --> <bean id="simpleJob" class="quartz.job.SimpleJob"/> <bean id="jobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="simpleJob"/> <property name="targetMethod" value="execute"/> <property name="concurrent" value="false" /> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobTask"/> <property name="cronExpression"> <value>0/1 * * * * ?</value> </property> </bean> <bean id="quartzScheduler" autowire="no" lazy-init="true" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean> </beans>
2. 测试类 Main.java
package quartz.spring;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) throws Exception {
new ClassPathXmlApplicationContext("quartz/spring/quartz.xml");
}
}