package timerTask;
import java.util.TimerTask;
public class SayHelloTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("测试TimerTask : Hello !!");
}
}
配置代码如下:javaTimer.xml
<bean id="sayHelloTask" class="timerTask.SayHelloTask"></bean> <bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask"> <ref bean="sayHelloTask" /> </property> <!-- 任务执行周期 5m 关于一些任务的参数请参考JDK doc文档和Spring相关文档--> <property name="period"> <value>5000</value> </property> <!-- 延时1m 执行任务 --> <property name="delay"> <value>1000</value> </property> </bean> <!-- 启动定时器 --> <bean id="timerBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTask" /> </list> </property> </bean>
使用Java中的定时器比较简单,其提供的任务也比较简单, 下面来看看使用quartz来执行一个复杂的任务.
首先制定一个任务, 实现QuartzJobBean中的方法或者使用MethodInvokingJobDetailFactoryBean.
package timerTask;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class SayHelloTaskUsingQuartz extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("使用Quartz 任务调度: Hello!!");
}
}
配置代码如下:quartzTimer.xml
<bean id="sayHelloJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>timerTask.SayHelloTaskUsingQuartz</value> </property> </bean> <!-- <bean id="sayHello" class="timerTask.SayHelloTaskUsingQuartz"></bean> <bean id="sayHelloJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="sayHello"> </property> <property name="targetMethod" value="execute"></property> </bean> --> <!-- 关键在如下两个触发器的配置 类似于Java的简单触发器 --> <bean id="helloTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail"> <ref bean="sayHelloJob" /> </property> <property name="startDelay"> <value>1000</value> </property> <property name="repeatInterval"> <value>5000</value> </property> <property name="repeatCount" value="100" /> </bean> <!-- 复杂触发器 --> <bean id="helloCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="sayHelloJob" /> </property> <property name="cronExpression"> <!-- 关键在配置此表达式 --> <value>0 49 15 * * ?</value> </property> </bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="helloTrigger"/> <ref bean="helloCronTrigger"/> </list> </property> </bean>
附:cronExpression配置说明
字段 | 允许值 | 允许的特殊字符 | ||
---|---|---|---|---|
秒 | 0-59 | , - * / | ||
分 | 0-59 | , - * / | ||
小时 | 0-23 | , - * / | ||
日期 | 1-31 | , - * ? / L W C | ||
月份 | 1-12 或者 JAN-DEC | , - * / | ||
星期 | 1-7 或者 SUN-SAT | , - * ? / L C # | ||
年(可选) | 留空, 1970-2099 | , - * / |
表达式 | 意义 | |
---|---|---|
"0 0 12 * * ?" | 每天中午12点触发 | |
"0 15 10 ? * *" | 每天上午10:15触发 | |
"0 15 10 * * ?" | 每天上午10:15触发 | |
"0 15 10 * * ? *" | 每天上午10:15触发 | |
"0 15 10 * * ? 2005" | 2005年的每天上午10:15 触发 | |
"0 * 14 * * ?" | 在每天下午2点到下午2:59期间的每1分钟触发 | |
"0 0/5 14 * * ?" | 在每天下午2点到下午2:55期间的每5分钟触发 | |
"0 0/5 14,18 * * ?" | 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 | |
"0 0-5 14 * * ?" | 在每天下午2点到下午2:05期间的每1分钟触发 | |
"0 10,44 14 ? 3 WED" | 每年三月的星期三的下午2:10和2:44触发 | |
"0 15 10 ? * MON-FRI" | 周一至周五的上午10:15触发 | |
"0 15 10 15 * ?" | 每月15日上午10:15触发 | |
"0 15 10 L * ?" | 每月最后一日的上午10:15触发 | |
"0 15 10 ? * 6L" | 每月的最后一个星期五上午10:15触发 | |
"0 15 10 ? * 6L 2002-2005" | 2002年至2005年的每月的最后一个星期五上午10:15触发 | |
"0 15 10 ? * 6#3" | 每月的第三个星期五上午10:15触发 |