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"); } }