正常情况下,一个任务类必须实现Job接口,且覆盖execute方法,才能被调度所调用。
在Spring中集成了Quartz框架,可以把任何一个bean的任意方法作为一个任务执行,而这个bean类无需实现任何接口,无需覆盖任何方法。
Spring可以把编程式调度变成声明式调度,只需要在xml文件中做一段配置。
Spring集成quartz框架例子1
通过Spring配置做一个简单触发器
任务bean1:TestService.java
public class TestService {
public void doSomething() {
System.out.println("Do Something Freely!");
}
public void justDoIt() {
System.out.println("Just Do It!");
}
}
Spring核心配置文件:applicationContext.xml
<!-- 普通的业务Bean -->
<bean id="testService" class="com.gene.TestService" />
<!-- 作业 -->
<bean id="jobDetail_test"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testService" />
<property name="targetMethod" value="justDoIt" />
</bean>
<!-- 简单触发器 ,一般都是每隔多少毫秒执行一次-->
<bean name="testTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail_test" />
<!-- 第一次启动延时(单位均为毫秒) -->
<property name="startDelay" value="10" />
<!-- 间隔时间 -->
<property name="repeatInterval" value="2000" />
<!-- 执行次数,默认没有限制 -->
<property name="repeatCount" value="10" />
<!-- 传递的参数 -->
<property name="jobDataAsMap">
<map>
<entry key="count" value="10" />
</map>
</property>
</bean>
<!-- 计划调度-->
<bean name="testScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="testTrigger" />
</list>
</property>
<property name="schedulerContextAsMap">
<map>
<entry key="timeout" value="30" />
</map>
</property>
</bean>
模拟spring容器初始化:TestQuartz.java
public class TestQuartz {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("Main方法执行开始了! 定时器伴随着Spring的初始化执行了。。。");
System.out.println("Main方法执行结束了!");
}
}
Spring集成quartz框架示例2
通过Spring配置做一个复杂触发器
需要用到cron表达式
任务bean2:TestService2.java
public class TestService2 {
public void doSomething() {
System.out.println("Do Something Freely!");
}
public void justDoIt() {
System.out.println("正在执行任务2!" + new Date());
}
}
Spring核心配置文件:applicationContext.xml
<!-- 普通的业务Bean2 -->
<bean id="testService2" class="com.gene.TestService2" />
<!-- 作业2 -->
<bean id="jobDetail_test2” class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testService2" />
<property name="targetMethod" value="justDoIt" />
</bean>
<!-- 复杂触发器 -->
<bean id="testTrigger2" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobDetail_test2" />
</property>
<!-- cron表达式,以下是在每分钟的10秒,15秒,20秒,45秒执行 -->
<property name="cronExpression">
<value>10,15,20,45 * * * * ?</value>
</property>
</bean>
<!-- 计划 -->
<bean name="testScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="testTrigger" />
<ref bean="testTrigger2" />
</list>
</property>
<property name="schedulerContextAsMap">
<map>
<entry key="timeout" value="30" />
</map>
</property>
</bean>
模拟spring容器初始化:TestQuartz.java
public class TestQuartz {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("Main方法执行开始了! 定时器伴随着Spring的初始化执行了。。。");
System.out.println("Main方法执行结束了!");
}
}