Просмотр исходного кода

修改删除pdf文件的定时任务,包括缩短任务周期、对pdf文件进行过滤等

sunyj 9 лет назад
Родитель
Сommit
78e27a6e8a

+ 7 - 35
src/main/java/com/uas/report/SystemProperties.java

@@ -13,22 +13,10 @@ import org.springframework.context.annotation.Configuration;
 public class SystemProperties {
 
 	/**
-	 * 每天定时任务时间中的小时
+	 * 定时任务间隔时间(毫秒)
 	 */
-	@Value("${schedule.daily.time.hour}")
-	private int dailyTaskHour;
-
-	/**
-	 * 每天定时任务时间中的分钟
-	 */
-	@Value("${schedule.daily.time.minute}")
-	private int dailyTaskMinute;
-
-	/**
-	 * 每天定时任务时间中的秒
-	 */
-	@Value("${schedule.daily.time.second}")
-	private int dailyTaskSecond;
+	@Value("${schedule.period}")
+	private int taskPeriod;
 
 	/**
 	 * 定时任务是否自动开启
@@ -36,28 +24,12 @@ public class SystemProperties {
 	@Value("${schedule.auto-start}")
 	private boolean taskAutoStart;
 
-	public int getDailyTaskHour() {
-		return dailyTaskHour;
-	}
-
-	public void setDailyTaskHour(int dailyTaskHour) {
-		this.dailyTaskHour = dailyTaskHour;
-	}
-
-	public int getDailyTaskMinute() {
-		return dailyTaskMinute;
-	}
-
-	public void setDailyTaskMinute(int dailyTaskMinute) {
-		this.dailyTaskMinute = dailyTaskMinute;
-	}
-
-	public int getDailyTaskSecond() {
-		return dailyTaskSecond;
+	public int getTaskPeriod() {
+		return taskPeriod;
 	}
 
-	public void setDailyTaskSecond(int dailyTaskSecond) {
-		this.dailyTaskSecond = dailyTaskSecond;
+	public void setTaskPeriod(int taskPeriod) {
+		this.taskPeriod = taskPeriod;
 	}
 
 	public boolean isTaskAutoStart() {

+ 2 - 3
src/main/java/com/uas/report/controller/ScheduleController.java

@@ -24,9 +24,8 @@ public class ScheduleController {
 
 	@RequestMapping("/deleteGeneratedFiles")
 	@ResponseBody
-	public String updateOverdue(@RequestParam(required = true) Integer hour,
-			@RequestParam(required = true) Integer minute, @RequestParam(required = true) Integer second) {
-		String message = "已开启:" + fileService.newDeleteGeneratedFilesDailyTask(hour, minute, second);
+	public String deleteGeneratedFiles(@RequestParam(required = true) Integer taskPeriod) {
+		String message = "已开启:" + fileService.newDeleteGeneratedFilesTask(taskPeriod);
 		restart();
 		return message;
 	}

+ 0 - 105
src/main/java/com/uas/report/schedule/model/DailyTaskInformation.java

@@ -1,105 +0,0 @@
-package com.uas.report.schedule.model;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Objects;
-
-import com.uas.report.schedule.service.Executable;
-
-/**
- * 每天定时任务
- * 
- * @author sunyj
- * @since 2016年12月12日 下午3:18:42
- */
-public class DailyTaskInformation extends TaskInformation {
-
-	/**
-	 * 一天的毫秒数
-	 */
-	private static final long MILLISECONDS_OF_ONE_DAY = 24 * 60 * 60 * 1000;
-
-	/**
-	 * 执行时间中的小时
-	 */
-	private int hour;
-
-	/**
-	 * 执行时间中的分钟
-	 */
-	private int minute;
-
-	/**
-	 * 执行时间中的秒
-	 */
-	private int second;
-
-	public DailyTaskInformation(String title, Executable command, int hour, int minute, int second) {
-		this.hour = hour;
-		this.minute = minute;
-		this.second = second;
-		setTitle(title);
-		setCommand(command);
-		setInitialDelay(getInitialDelay());
-		setPeriod(MILLISECONDS_OF_ONE_DAY);
-	}
-
-	public int getHour() {
-		return hour;
-	}
-
-	public void setHour(int hour) {
-		this.hour = hour;
-	}
-
-	public int getMinute() {
-		return minute;
-	}
-
-	public void setMinute(int minute) {
-		this.minute = minute;
-	}
-
-	public int getSecond() {
-		return second;
-	}
-
-	public void setSecond(int second) {
-		this.second = second;
-	}
-
-	@Override
-	public long getInitialDelay() {
-		Calendar nowCalendar = Calendar.getInstance();
-		nowCalendar.setTime(new Date());
-		Calendar initialDelayCalendar = (Calendar) nowCalendar.clone();
-		initialDelayCalendar.set(Calendar.HOUR_OF_DAY, hour);
-		initialDelayCalendar.set(Calendar.MINUTE, minute);
-		initialDelayCalendar.set(Calendar.SECOND, second);
-		if (initialDelayCalendar.before(nowCalendar)) {
-			initialDelayCalendar.add(Calendar.DAY_OF_MONTH, 1);
-		}
-		return initialDelayCalendar.getTimeInMillis() - nowCalendar.getTimeInMillis();
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj == null || getClass() != obj.getClass() || !(obj instanceof DailyTaskInformation)) {
-			return false;
-		}
-		DailyTaskInformation other = (DailyTaskInformation) obj;
-		// command不好比较,不进行比较
-		return Objects.equals(getTitle(), other.getTitle()) && hour == other.getHour() && minute == other.getMinute()
-				&& second == other.getSecond();
-	}
-
-	@Override
-	public String toString() {
-		return "DailyTaskInformation [title=" + getTitle() + ", hour=" + hour + ", minute=" + minute + ", second="
-				+ second + "]";
-	}
-
-}

+ 9 - 5
src/main/java/com/uas/report/schedule/service/impl/TaskServiceImpl.java

@@ -148,11 +148,15 @@ public class TaskServiceImpl implements TaskService {
 		return new Runnable() {
 			@Override
 			public void run() {
-				logger.info("Task run...");
-				Executable command = taskInformation.getCommand();
-				String result = command.execute();
-				TaskLog taskLog = new TaskLog(taskInformation, new Date(), result);
-				saveLog(taskLog);
+				try {
+					logger.info("Task run...");
+					Executable command = taskInformation.getCommand();
+					String result = command.execute();
+					saveLog(new TaskLog(taskInformation, new Date(), result));
+				} catch (Exception e) {
+					saveLog(new TaskLog(taskInformation, new Date(),
+							"定时任务出错" + new ReportException(e).getDetailedMessage(e)));
+				}
 			}
 		};
 	}

+ 5 - 9
src/main/java/com/uas/report/service/FileService.java

@@ -7,7 +7,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.web.multipart.MultipartFile;
 
-import com.uas.report.schedule.model.DailyTaskInformation;
+import com.uas.report.schedule.model.TaskInformation;
 
 /**
  * 文件操作
@@ -196,15 +196,11 @@ public interface FileService {
 	public void createPagedPdfFiles(String pdfFileAbsolutePath);
 
 	/**
-	 * 开启删除产生的pdf等文件的每天定时任务
+	 * 开启删除产生的pdf等文件的定时任务
 	 * 
-	 * @param hour
-	 *            任务时间:小时
-	 * @param minute
-	 *            任务时间:分钟
-	 * @param second
-	 *            任务时间:秒
+	 * @param taskPeriod
+	 *            定时任务间隔时间(毫秒)
 	 * @return
 	 */
-	public DailyTaskInformation newDeleteGeneratedFilesDailyTask(Integer hour, Integer minute, Integer second);
+	public TaskInformation newDeleteGeneratedFilesTask(Integer taskPeriod);
 }

+ 27 - 9
src/main/java/com/uas/report/service/impl/FileServiceImpl.java

@@ -36,7 +36,7 @@ import com.lowagie.text.pdf.PdfCopy;
 import com.lowagie.text.pdf.PdfReader;
 import com.uas.report.SpecialProperties;
 import com.uas.report.core.exception.ReportException;
-import com.uas.report.schedule.model.DailyTaskInformation;
+import com.uas.report.schedule.model.TaskInformation;
 import com.uas.report.schedule.service.Executable;
 import com.uas.report.schedule.service.TaskService;
 import com.uas.report.service.FileService;
@@ -54,6 +54,16 @@ public class FileServiceImpl implements FileService {
 	@Autowired
 	private TaskService taskService;
 
+	/**
+	 * 第一次执行的延迟时间间隔为30秒
+	 */
+	private static final long INITIAL_DELAY = 30 * 1000;
+
+	/**
+	 * 产生的pdf的有效期(最高为10分钟)
+	 */
+	private static final int PDF_MAX_INVALID_INTERVAL = 10 * 60 * 1000;
+
 	private Logger logger = LoggerFactory.getLogger(getClass());
 
 	/**
@@ -421,8 +431,7 @@ public class FileServiceImpl implements FileService {
 			File jrxmlFile = new File(jrxmlFileAbsolutePath);
 			if (file.exists() && jrxmlFile.exists()) {
 				long interval = new Date().getTime() - file.lastModified();
-				// 剩余的有效期(最高为10分钟)
-				long validity = 10 * 60 * 1000 - interval;
+				long validity = PDF_MAX_INVALID_INTERVAL - interval;
 				// 有效期大于0并且比模板文件新
 				if (validity > 0 && file.lastModified() > jrxmlFile.lastModified()) {
 					logger.info(file.getName() + " will be expired after " + validity / 1000.0 + "s");
@@ -509,21 +518,30 @@ public class FileServiceImpl implements FileService {
 	}
 
 	@Override
-	public DailyTaskInformation newDeleteGeneratedFilesDailyTask(Integer hour, Integer minute, Integer second) {
-		if (hour == null || minute == null || second == null) {
+	public TaskInformation newDeleteGeneratedFilesTask(Integer taskPeriod) {
+		if (taskPeriod == null) {
 			throw new NullPointerException();
 		}
 		String title = "定时删除pdf等文件";
 		Executable command = new Executable() {
 			@Override
 			public String execute() {
-				delete(ReportConstants.GENERATED_FILES_ABSOLUTE_PATH, true);
+				FileUtils.deleteDir(new File(ReportConstants.GENERATED_FILES_ABSOLUTE_PATH), new FileFilter() {
+					@Override
+					public boolean accept(File file) {
+						// 只删除已过期的文件
+						if (new Date().getTime() - file.lastModified() - PDF_MAX_INVALID_INTERVAL > 0) {
+							return true;
+						}
+						return false;
+					}
+				});
 				return "success";
 			}
 		};
-		DailyTaskInformation dailyTaskInformation = new DailyTaskInformation(title, command, hour, minute, second);
-		taskService.newTask(dailyTaskInformation);
-		return dailyTaskInformation;
+		TaskInformation taskInformation = new TaskInformation(title, command, INITIAL_DELAY, taskPeriod);
+		taskService.newTask(taskInformation);
+		return taskInformation;
 	}
 
 }

+ 18 - 1
src/main/java/com/uas/report/util/FileUtils.java

@@ -1,6 +1,7 @@
 package com.uas.report.util;
 
 import java.io.File;
+import java.io.FileFilter;
 import java.io.FileOutputStream;
 import java.io.IOException;
 
@@ -55,15 +56,31 @@ public class FileUtils {
 	 *            文件(夹)
 	 */
 	public static void deleteDir(File file) {
+		deleteDir(file, null);
+	}
+
+	/**
+	 * 递归删除文件(夹)
+	 * 
+	 * @param file
+	 *            文件(夹)
+	 * @param filter
+	 *            文件过滤
+	 */
+	public static void deleteDir(File file, FileFilter filter) {
 		if (file == null) {
 			return;
 		}
 		if (file.isDirectory()) {
 			File[] files = file.listFiles();
 			for (File f : files) {
-				deleteDir(f);
+				deleteDir(f, filter);
 			}
 		}
+		// 如果文件不符合条件,则不删除
+		if (filter != null && !filter.accept(file)) {
+			return;
+		}
 		file.delete();
 		logger.info("Deleted... " + file.getPath());
 	}

+ 2 - 3
src/main/java/com/uas/report/util/ReportUtils.java

@@ -30,7 +30,7 @@ public class ReportUtils {
 			throw new ReportException("未传入报表名称!");
 		}
 	}
-	
+
 	/**
 	 * 开启定时任务
 	 */
@@ -39,8 +39,7 @@ public class ReportUtils {
 		if (systemProperties.isTaskAutoStart()) {
 			FileService fileService = ContextUtils.getBean(FileService.class);
 			TaskService taskService = ContextUtils.getBean(TaskService.class);
-			fileService.newDeleteGeneratedFilesDailyTask(systemProperties.getDailyTaskHour(),
-					systemProperties.getDailyTaskMinute(), systemProperties.getDailyTaskSecond());
+			fileService.newDeleteGeneratedFilesTask(systemProperties.getTaskPeriod());
 
 			// 开启定时任务
 			if (!taskService.isStopped()) {

+ 1 - 5
src/main/resources/bootstrap.yml

@@ -12,11 +12,7 @@ spring:
     dialect: org.hibernate.dialect.Oracle10gDialect
   
 schedule:
- daily:
-  time:
-   hour: 3
-   minute: 0
-   second: 0
+ period: 3600000
  auto-start: true
  
 jasperserver:

+ 1 - 1
src/main/webapp/WEB-INF/views/console.html

@@ -108,7 +108,7 @@
 
 			<h2>5.定时任务</h2>
 			<ol>
-				<li><a target="_blank">schedule/deleteGeneratedFiles?hour=3&minute=0&second=0</a></li>
+				<li><a target="_blank">schedule/deleteGeneratedFiles?taskPeriod=3600000</a></li>
 				<li><a target="_blank">schedule/tasks</a></li>
 				<li><a target="_blank">schedule/start</a></li>
 				<li><a target="_blank">schedule/stop</a></li>