相于Quartz和Timer的用法请见开源技术部分:http://zmx.iteye.com/admin/blogs/1479582
一,添加对Spring的支持
web.xml中添加:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
二,applicationContext.xml配置,以下代码在<beans></beans>之间
使用:Quartz
一.编写调试的作业,作业有两种方式,
1继承QuartzJobBean做为作业
<!-- 第一步:编写JOB --> <!-- 第一种方式:使用JobDetailBean --> <bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <!-- 设置自己的JOB类,要继承QuartzJobBean类,重写executeInternal方法 --> <property name="jobClass"> <value>com.mengya.ExampleJob</value> </property> <!-- 设置job的属性值 --> <property name="jobDataAsMap"> <map> <entry key="timeout"> <value>50</value> </entry> </map> </property> </bean>
com.mengya.ExampleJob即为作业代码如下:
/**
* 作业
*
* @author mingxue.zhang@163.com 2012-4-8
*/
public class ExampleJob extends QuartzJobBean {
//自己的属性
private String timeout;
public void setTimeout(String timeout) {
this.timeout = timeout;
}
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("======>" + arg0.getJobDetail().getName()
+ sdf.format(new Date()) + " " + this.timeout);
}
}
2.普通JavaBean做为作业
<!-- 第二种方式:使用MethodInvokingJobDetailFactoryBean --> <!-- 1、自己的JOB类,普通的JavaBean --> <bean id="exampleBusinessObject" class="com.mengya.BusinessObject"></bean> <!-- 2、包装 --> <bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="exampleBusinessObject" /> </property> <property name="targetMethod"> <value>doIt</value> </property> <!-- 默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个触发器, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false。 --> <property name="concurrent"> <value>false</value> </property> </bean>
com.mengya.BusinessObject是一个普通的java类代码如下:
/**
* 普通的java类做为做业
*
* @author mingxue.zhang@163.com 2012-4-8
*/
public class BusinessObject {
public void doIt() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("====>:doIt " + sdf.format(new Date()));
}
public void doSomeThing() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(Calendar.getInstance().getTime())
+ "-------doSomeThing------");
}
}
二配置好做业以后接下来配置定时器,定时器配置也有两种方式
1使用SimpleTriggerBean,如下:
<!-- 第一种方式--> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail"> <!-- see the example of method invoking job above --> <ref bean="methodInvokingJobDetail" /> </property> <property name="startDelay"> <value>10000</value><!-- 启动10秒后开始运行 --> </property> <property name="repeatInterval"> <value>50000</value><!-- 每50秒运行 --> </property> </bean>
2使用CronTriggerBean,用cron表达式
<!-- 第二种方式 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="exampleJob" /> </property> <property name="cronExpression"> <!-- run every morning at 6 am --> <value>5 0/1 * * * ? *</value><!-- 第分钟的第5秒运行 --> </property> </bean>
三用了做业和定时器以后就是组装了
<!-- 第三步:组合调度 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="simpleTrigger" /> <ref local="cronTrigger" /> </list> </property> </bean>
使用:Timer
一.编写做业,也有两种方式
1普通的JavaBean
<!-- 1普通的JavaBean --> <bean id="checkEmail" class="com.mengya.CheckEmailAddresses"> <property name="emailAddresses"> <list> <value>mingxue.zhang@163.com</value> </list> </property> </bean>
com.mengya.CheckEmailAddresses代码如下:
public class CheckEmailAddresses extends TimerTask {
private List<String> emailAddresses;
public void setEmailAddresses(List<String> emailAddresses) {
this.emailAddresses = emailAddresses;
}
@Override
public void run() {
System.out.println("check:" + emailAddresses);
}
}
2使用MethodInvokingTimerTaskFactoryBean包装
<bean id="methodInvokingTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject"> <ref bean="exampleBusinessObject" /> </property> <property name="targetMethod"> <value>doSomeThing</value> </property> </bean>
exampleBusinessObject就是上面的com.mengya.BusinessObject
二设置定时器,JDK的Timer比较简单
<bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="delay"> <value>5000</value><!-- 启动5秒后开始运行--> </property> <property name="period"> <value>50000</value><!-- 每50秒运行 --> </property> <property name="timerTask"> <ref local="checkEmail" /> </property> </bean> <bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="delay"> <value>15000</value><!-- 启动15秒后开始运行--> </property> <property name="period"> <value>15000</value><!-- 每15秒运行 --> </property> <property name="timerTask"> <ref local="methodInvokingTask" /> </property> </bean>
三,调度
<!-- 第三步:调度 --> <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTask1" /> <ref bean="scheduledTask2" /> </list> </property> </bean>