Quartz与Spring强强联手,定时任务实现更容易
环境:
Spring 2.5.4
Quartz 1.6.0
Quartz是一个企业级的定时任务执行工具,使用起来也至关容易。可是也有点约束----每一个做业必须实现Job接口。
Spring早在1.0就对Quartz提供了支持。Spring AOP的强大功能能够将这个无聊的事情见鬼去吧。咱们甚至能够将任何一个普通类的方法设定为定时执行的方法。而且在Spring初始化的自动启动定时器(不须要你去写Main方法),在Spring关闭的时候结束定时器的运行,一避免应用服务器都关闭了,定时器还在后台默默无闻“空转”。呵呵,下面就看个例子吧:
目标:将一个普通的业务方法做为定时做业的方法经过Spring配置去执行。
代码:
第一步:写业务方法
package stu.quartz;
/**
* 业务方法
*
* @author leizhimin,2008-10-8 15:41:52
*/
public
class TestService {
public
void doSomething() {
System.out.println(
"Do Something Freely!");
}
public
void justDoIt() {
System.out.println(
"Just Do It!");
}
}
2、配置Spring
<?
xml
version
="1.0"
encoding
="UTF-8"
?>
<
beans
default-autowire
="byName"
xmlns
="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans.xsd[/url]"
>
<!--
普通的业务Bean -->
<
bean
name
="testService"
class
="stu.quartz.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
="100"
/>
<
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
>
<!--
Quartz的高级配置-->
<!--
<property name="configLocation" value="classpath:com/lavasoft/quartz.properties"/>-->
</
bean
>
</
beans
>
3、写测试
package stu.quartz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试类
*
* @author leizhimin,2008-10-8 16:33:21
*/
public
class TestQuartz {
public
static
void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext(
"/Application_quartz.xml");
System.out.println(
"Main方法执行开始了! 定时器伴随着Spring的初始化执行了。。。");
System.out.println(
"Main方法执行结束了!");
}
}
运行测试:
Main方法执行开始了! 定时器伴随着Spring的初始化执行了。。。
Main方法执行结束了!
Just Do It!
Just Do It!
Just Do It!
Just Do It!
Just Do It!
......
运行结果表名:在Spring初始化后,定时器根据延迟时间启动执行,而且在执行过过程当中,Main线程一直没有退出。定时器线程一直在执行。
在强行终止Main线程的时候,定时器也中止执行。