1.简述
在这之前我们先看看JDK给我们提供的Timmer,是如何调度的吧。
<bean id="scheduledTask" class= "org.springframework.scheduling.timer.ScheduledTimerTask">
<!--程序启动后开始执行任务的延迟时间 -->
<property name="delay" value="0" />
<!--每隔一天【一天=24×60×60×1000微秒】执行一次-->
<property name="period" value="86400000" />
<!--业务统计报表bean -->
<property name="timerTask" ref="businessReport" />
</bean>
其中period就是一天的微秒数。如果每月1日运行一次,那就复杂了,不知如何配置。因为月份有大、小月之分,每月的微秒数都不一样。
而spring 提供的quarts不仅仅有类似于JDK提供的Timmer,还有着类似于unix的cron服务的配置,这样我们移植起来就简单多了。
进入正题之前,先说说准备工作:
1.1 需要的jar包
spring.jar,
quartz.jar,
commons-logging-1.0.4.jar,
commons-dbcp-1.2.2.jar,
commons-pool-1.3.jar
1.2 版本问题
spring3.1以下的版本的,请配合使用quarts1,不然会出问题。
2. quarts实现方法
具体实现方法有两种:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法仍然是普通类。很显然,第二种方式远比第一种方式来的灵活。
2.1 继承QuartzJobBean
package com.ncs.hj;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class SpringQtz extends QuartzJobBean{
private static int counter = 0;
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println();
long ms = System.currentTimeMillis();
System.out.println("\t\t" + new Date(ms));
System.out.println(ms);
System.out.println("(" + counter++ + ")");
String s = (String) context.getMergedJobDataMap().get("service");
System.out.println(s);
System.out.println();
}
}
2.2 使用配置文件
配置spring的applicationContext.xml文件
配置任务JobDetailBean
配置触发器 CronTriggerBean
配置调度器 SchedulerFactoryBean
spring配置文件:
<pre name="code" class="html" style="font-size: 14px; line-height: 25.2000007629395px;"><!-- 定义目标bean和bean中的方法 -->
<bean id="userPostitionQtzJob" class="com.network.manage.device.task.WLUserPositionTask">
<span style="white-space:pre"> </span><property name="wlFingerSetDao"><!--注入dao,操作数据库-->
<span style="white-space:pre"> </span><ref bean="wlFingerSetDao"/>
<span style="white-space:pre"> </span></property>
</bean>
<!-- 任务配置bean和bean的方法 -->
<bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<span style="white-space:pre"> </span> <property name="targetObject">
<span style="white-space:pre"> </span> <ref bean="userPostitionQtzJob"/> <span style="line-height: 25.2000007629395px; font-family: Helvetica, Tahoma, Arial, sans-serif;"><!-- 要执行的bean名--></span>
<span style="white-space:pre"> </span> </property>
<span style="white-space:pre"> </span> <property name="targetMethod"> <!-- 要执行的方法名称 -->
<span style="white-space:pre"> </span> <value>backUpUserPositionFile</value>
<span style="white-space:pre"> </span> </property>
<span style="white-space:pre"> </span></bean>
<span style="white-space:pre"> </span><!-- 调度触发器设置 -->
<span style="white-space:pre"> </span><bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<span style="white-space:pre"> </span> <property name="jobDetail" ref="SpringQtzJobMethod"></property><!--配置任务-->
<span style="white-space:pre"> </span> <property name="cronExpression" value="0 54 * * * ?"></property>
<span style="white-space:pre"> </span></bean>
<span style="white-space:pre"> </span><!-- 调度工厂 -->
<span style="white-space:pre"> </span><bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<span style="white-space:pre"> </span> <property name="triggers">
<span style="white-space:pre"> </span> <list>
<span style="white-space:pre"> </span> <ref bean="CronTriggerBean"/> <!--配置触发器-->
<span style="white-space:pre"> </span> </list>
<span style="white-space:pre"> </span> </property>
<span style="white-space:pre"> </span></bean>
Java代码:
package com.network.manage.device.task;
import java.io.File;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.network.manage.common.util.DateUtil;
import com.network.manage.wifiLocation.dao.WLFingerSetDao;
public class WLUserPositionTask extends QuartzJobBean {
private WLFingerSetDao wlFingerSetDao;
private static Log log = LogFactory.getLog("WLUserPositionTask");
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
}
<span style="white-space:pre"> </span>// 执行任务的方法
public void backUpUserPositionFile(){
try {
// 数据备份
Date nowDate = new Date();
log.info("开始时间:"+DateUtil.dateToAllCode(new Date(nowDate.getTime()-60*60*1000)).substring(0, 13));
log.info("结束时间:"+DateUtil.dateToAllCode(new Date(nowDate.getTime())).substring(0, 13));
Date endTime = DateUtil.strToDate(DateUtil.dateToAllCode(new Date(nowDate.getTime())).substring(0, 13)+":00:00");
Date startTime = DateUtil.strToDate(DateUtil.dateToAllCode(new Date(nowDate.getTime()-60*60*1000)).substring(0, 13)+":00:00");
String ftpHome = System.getenv("NMSFTP_HOME");
log.info("配置路径为:"+System.getProperty("user.home"));
String path = "e://wl/stationHistoryData/"+DateUtil.dateToShortCode(startTime)+"/";
if(ftpHome != null && !ftpHome.equals("")){
File ftpFile = new File(ftpHome);
if(ftpFile.exists() && ftpFile.isDirectory()){
path = ftpHome.replace("\\", "/") + "/home/stationHistoryData/"+DateUtil.dateToShortCode(startTime)+"/";
}
}
File file=new File(path);
if(!file.exists() && !file.isDirectory()){
file.mkdirs();
file.setWritable(true, false);
}
String file2 = path + "originalData_"+DateUtil.dateToStringCus(startTime,"HH")+".csv";
String sql = "select * from wl_user_position where positionTime >= '"+ DateUtil.dateToAllCode(startTime) +"' "
+ "and positionTime < '"+ DateUtil.dateToAllCode(endTime) +"' "
+ "into outfile '"+file2+"' fields terminated by ',' lines terminated by '\\r\\n'";
wlFingerSetDao.executeSqlQuery(sql);
log.info("成功备份 "+DateUtil.dateToCode(startTime)+" To "+DateUtil.dateToCode(endTime)+" 之间的定位数据到"+file2);
} catch (Exception e) {
e.printStackTrace();
log.info(e);
}
}
public WLFingerSetDao getWlFingerSetDao() {
return wlFingerSetDao;
}
public void setWlFingerSetDao(WLFingerSetDao wlFingerSetDao) {
this.wlFingerSetDao = wlFingerSetDao;
}
}
这样就实现了定时任务的处理了。
附录:
"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触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *
"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触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *