定时清理上传的文件 使用quartz来和spring集成定时任务

当前项目技术使用struts2+spring2+hibernate3 现在需要开发一个新功能,需要系统来定时来执行一段代码,比如每天大半夜定时进行删除上传的文件。可以使用著名的 quartz来和spring做这件事。

配置quartz的文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

	<!--定义定时任务类-->
	<bean id="someData" class="com.init.JobData" />

	<bean id="someJob" class="com.init.DemoJob">
		<property name="jobData">
			<ref bean="someData" />
		</property>
	</bean>


	<bean id="jobDetailBean"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="someJob" />
		</property>
		<property name="targetMethod">
			<value>execute</value>
		</property>
	</bean>
	


	<bean id="cronTriggerBean"
		class="org.springframework.scheduling.quartz.CronTriggerBean">
		<!--这里定义定时任务的对象的位置-->
		<property name="jobDetail">
			<ref bean="jobDetailBean" />
		</property>
		<!--这里定义每月15日上午凌晨3:15触发-->
		<property name="cronExpression">
			<value>0 15 3 15 * ?</value>
		</property>
	</bean>
	<!-- 
		1.秒(0–59) 
		
		2.分钟(0–59) 
		
		3.小时(0–23) 
		
		4.月份中的日期(1–31) 
		
		5.月份(1–12或JAN–DEC) 
		
		6.星期中的日期(1–7或SUN–SAT) 
		
		7.年份(1970–2099) 
		十秒触发
		0/10 * * * * ?
		
		0 0 10,14,16 * * ? 
		每天上午10点,下午2点和下午4点 
		0 0,15,30,45 * 1-10 * ? 
		每月前10天每隔15分钟 
		30 0 0 1 1 ? 2012 
		在2012年1月1日午夜过30秒时 
		0 0 8-5 ? * MON-FRI 
		每个工作日的工作时间 
		"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
	-->
	<bean id="schedulerFactoryBean"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTriggerBean" />
			</list>
		</property>
	</bean>

</beans>




import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.apache.bcel.classfile.Constant;
import util.file.FileTools;

public class JobData  {
	private static Log log = LogFactory.getLog(JobData.class);
	int datenumbet=15; //以前
	SimpleDateFormat ddd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
	public String delUploadData() { 
		log.info("时隔"+datenumbet+"天 删除导出的excel文件开始 执行时间: "+ddd.format(new Date()));
		String path = Constant.class.getResource("/").getPath(); // 獲取classpath路徑
		path = path.substring(0, path.lastIndexOf("WEB-INF")) + "upload/"; // WEB-INF上一級就是項目的根目錄
		try {
			FileTools.getInstance().deleteFile(path, datenumbet,"*");
		} catch (Exception e) {
			log.info("\r删除失败: "+e.getMessage());
		}
		log.info("\r执行结束: "+ddd.format(new Date()));
	    return "执行时间: " + ddd.format(new Date())+ "\r"+path; 
	    
	    
	} 
	
	
	public String delOracleData() { 
		log.info("时隔"+datenumbet+"天 删除备份的oracle文件开始 执行时间: "+ddd.format(new Date()));
		try {
			FileTools.getInstance().deleteFile("E:\\back", datenumbet,"dmp");
		} catch (Exception e) {
			log.info("\r删除失败: "+e.getMessage());
		}
		log.info("\r执行结束: "+ddd.format(new Date()));
	    return "执行时间: " + ddd.format(new Date())+ "\r"+"E:\\back"; 
	    
	    
	} 
}







public class DemoJob  {
//extends QuartzJobBean
	private JobData jobData;

	public JobData getJobData() {
		return jobData;
	}

	public void setJobData(JobData jobData) {
		this.jobData = jobData;
	}

//	public void executeInternal(JobExecutionContext context) {
//		System.out.println(jobData.getData() + " is executed.\r");
//		String temp = Constant.class.getResource("/").getPath(); // 獲取classpath路徑
//		temp = temp.substring(0, temp.lastIndexOf("WEB-INF")) + "upload/"; // WEB-INF上一級就是項目的根目錄
//		System.out.print(temp + "\r");
//	}

	public void execute() {
		System.out.print(jobData.delUploadData());
		System.out.print(jobData.delOracleData());
	}
}


FileTools 类删除文件的方法


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

import util.other.DateUtils;

@SuppressWarnings( { "serial", "unchecked", "static-access", "unused" })
public class FileTools {

	private static final FileTools ft = new FileTools();

	public static FileTools getInstance() {
		return FileTools.ft;
	}

	private FileTools() {
	}


	

	public void deleteFile(String path, int datatime, String pttrn)
			throws Exception {
		if (StringUtils.isNotBlank(pttrn)) {
			File file = new File(path);
			File[] array = file.listFiles();
			for (int i = 0; i < array.length; i++) {
				File filepro = array[i];
				if (filepro.exists() && filepro.isFile()) {
					if(!filepro.getName().equals("ajbftemp.xls")){
					SimpleDateFormat ft = new SimpleDateFormat(
							"yyyy-MM-dd HH:mm:ss");
					if (DateUtils.getDayCompare(ft.parse(ft.format(filepro
							.lastModified()))) >= datatime) {
						if (pttrn.equals("*")) {
							filepro.delete();
						} else {
							String uuid = StringUtils.substringAfterLast(
									filepro.getName(), ".");
							if (uuid.trim().toUpperCase().equals(pttrn.trim().toUpperCase())) {
								filepro.delete();
							}
						}
					}
					}
				}
			}
		}
	}

	

	

	

}



DateUtils.getDayCompare相隔天数比较的方法
/**
	 * 日期比较函数
	 * 
	 * @param second
	 *            Date 比较日期
	 * @return 返回当前日期与比较日期相差天数
	 * @throws ParseException
	 */
	public static long getDayCompare(Date second) throws ParseException {
		Date dt = new Date();
		SimpleDateFormat ft = new SimpleDateFormat("yyyy/MM/dd");
		dt = ft.parse(ft.format(dt));
		second = ft.parse(ft.format(second));
		return dt.getTime() / 1000 / 60 / 60 / 24 - second.getTime() / 1000
				/ 60 / 60 / 24;
	}


quartz需要包

猜你喜欢

转载自zhoualine.iteye.com/blog/1035591