spring quarts 任务调度

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值