Quartz为任务调度提供了大量的功能,是一个强大的企业级任务调度框架。而spring对Quartz提供了一流的继承支持,让我们大大简化了任务调度的实现。
如何简化应用Quartz,spring为我们提供了如下若干类:
1、QuertzJobBean
Quartz中job接口的简单实现(子类),提供了executeInternal() 方法定义待执行的任务;
2、JobDetailBean
spring为简化JobDetail子类开发的实现,可以借助JobDetailBean中的jobClass属性设置Job对象类型;
3、SimpleTriggerBean Quartz中SimpleTrigger类的子类;
4、CronTriggerBean
Quartz中CronTrigger类的子类,其中可以借助cronExpression 属性能够设定任务的执行时机;
5、MethodInvokingJobDetailFactoryBean:
不比需要QuartzJobBean 类即可完成任务调度,只需知道类的方法名即可;
6、SchedulerFactoryBean:用于设置Quartz scheduler,供暴露给应用使用,借助于他启动定时器。
需要的jar包
spring框架的jar包+quartz.jar
通过继承QuertzJobBean,用JobDetailBean发布实现
package com.openv.spring;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class LogJobBean extends QuartzJobBean{
//设定超时时间
@SuppressWarnings("unused")
private int timeout;
public void setTimeout(int timeout) {
this.timeout = timeout;
}
//定义待完成的任务
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("任务正在执行.......");
}
}
spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 定义JobDetailBean -->
<bean id="logJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<!-- 定义任务 -->
<property name="jobClass">
<value>com.openv.spring.LogJobBean</value>
</property>
<!-- 定义属性 -->
<property name="jobDataAsMap">
<map>
<entry key="timeout">
<value>10</value>
</entry>
</map>
</property>
</bean>
<!-- 定义触发条件 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 应用上述LogJobBean -->
<property name="jobDetail">
<ref bean="logJob" />
</property>
<!-- 第一次执行的时间,需要等待5秒钟 -->
<property name="startDelay">
<value>5000</value>
</property>
<!-- 任务执行周期为2秒 -->
<property name="repeatInterval">
<value>2000</value>
</property>
<!-- 执行次数 -->
<property name="repeatCount">
<value>2</value>
</property>
</bean>
<!-- 把任务交给日程 -->
<bean id="sfb"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="simpleTrigger" />
</list>
</property>
</bean>
</beans>
客户端调用测试
package com.openv.spring;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//客户端测试
public class LogJobBeanTest {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("logContent.xml");
Scheduler sfb=(Scheduler) ac.getBean("sfb");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭
try {
sfb.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
通过MethodInvokingJobDetailFactoryBean实现
任务类代码:
package com.openv.spring;
public class LogJobMethodBean {
//具体任务
public void log(){
System.out.println("任务正在执行.......");
}
}
spring配置文件
<?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="logJobMethodBean"
class="com.openv.spring.LogJobMethodBean">
</bean>
<bean id="miJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="logJobMethodBean"/>
</property>
<property name="targetMethod">
<value>log</value>
</property>
</bean>
<bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<!-- 引用上述LogJobBean -->
<ref bean="miJobDetail"/>
</property>
<property name="startDelay">
<!-- 第一次执行任务前,需要等待5秒钟 -->
<value>5000</value>
</property>
<property name="repeatInterval">
<!-- 任务执行周期为2秒钟 -->
<value>2000</value>
</property>
<property name="repeatCount">
<!-- 执行次数 -->
<value>3</value>
</property>
</bean>
<bean id="sfb"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="simpleTrigger"/>
</list>
</property>
</bean>
</beans>
测试客户端代码
package com.openv.spring;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class LogJobMethodBeanTest {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("methodContent.xml");
Scheduler sfb=(Scheduler) ac.getBean("sfb");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
sfb.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
另外可以通过CronTriggerBean精确控制任务的具体执行时间,这在实际应用中广为使用。如下给出配置片段
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="miJobDetail"/>
</property>
<property name="cronExpression">
<!-- 每隔10秒执行一次 -->
<value>0/10 * * * * ?</value>
</property>
</bean>
其中,cronExpression表达式为6或7位。各个位之间通常用空格隔开。每位的具体含义如图下: