Browse Source

增加开启、关闭定时任务的接口

sunyj 9 years ago
parent
commit
1c3a83d60f

+ 39 - 26
search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/ScheduleController.java

@@ -1,50 +1,63 @@
 package com.uas.search.console.b2b.controller;
 
-import java.util.Date;
+import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import com.uas.search.console.b2b.schedule.DailyTaskManager;
+import com.uas.search.console.b2b.schedule.DailyTaskService;
 import com.uas.search.console.b2b.schedule.model.DailyTaskInformation;
-import com.uas.search.console.b2b.schedule.model.DailyTaskLog;
 import com.uas.search.console.b2b.service.PurchaseInquiryMouldSimpleInfoService;
 
 @Controller
 @RequestMapping("/schedule")
 public class ScheduleController {
+
 	@Autowired
 	private PurchaseInquiryMouldSimpleInfoService purchaseInquiryMouldService;
 
-	private DailyTaskManager dailyTaskManager = new DailyTaskManager();
-
-	private Logger logger = LoggerFactory.getLogger(ScheduleController.class);
+	@Autowired
+	private DailyTaskService dailyTaskService;
 
 	@RequestMapping("/updateOverdue")
 	@ResponseBody
-	public String updateOverdue(@RequestParam(required = true) String title,
-			@RequestParam(required = true) Integer hour, @RequestParam(required = true) Integer minute,
-			@RequestParam(required = true) Integer second) {
-		final DailyTaskInformation dailyTaskInformation = new DailyTaskInformation();
-		dailyTaskInformation.setTitle(title);
-		dailyTaskInformation.setHour(hour);
-		dailyTaskInformation.setMinute(minute);
-		dailyTaskInformation.setSecond(second);
-		dailyTaskInformation.setCommand(new Runnable() {
-			@Override
-			public void run() {
-				logger.info("Daily Task run...");
-				purchaseInquiryMouldService.updateOverdue();
-				DailyTaskLog dailyTaskLog = new DailyTaskLog(dailyTaskInformation, new Date(), "success");
-				dailyTaskManager.saveLog(dailyTaskLog);
-			}
-		});
-		dailyTaskManager.newDailyTask(dailyTaskInformation);
+	public String updateOverdue(@RequestParam(required = true) Integer hour,
+			@RequestParam(required = true) Integer minute, @RequestParam(required = true) Integer second) {
+		purchaseInquiryMouldService.startUpdateOverdueDailyTask(hour, minute, second);
 		return "ok";
 	}
+
+	@RequestMapping("/tasks")
+	@ResponseBody
+	public List<DailyTaskInformation> allDailyTaskInformations() {
+		return dailyTaskService.allDailyTaskInformations();
+	}
+
+	@RequestMapping("/start")
+	@ResponseBody
+	public String start() {
+		return dailyTaskService.start();
+	}
+
+	@RequestMapping("/stop")
+	@ResponseBody
+	public String stop() {
+		return dailyTaskService.stop();
+	}
+
+	@RequestMapping("/restart")
+	@ResponseBody
+	public String restart() {
+		dailyTaskService.stop();
+		return dailyTaskService.start();
+	}
+
+	@RequestMapping("/isStopped")
+	@ResponseBody
+	public boolean isStopped() {
+		return dailyTaskService.isStopped();
+	}
 }

+ 57 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/DailyTaskService.java

@@ -0,0 +1,57 @@
+package com.uas.search.console.b2b.schedule;
+
+import java.util.List;
+
+import com.uas.search.console.b2b.schedule.model.DailyTaskInformation;
+import com.uas.search.console.b2b.schedule.model.DailyTaskLog;
+
+/**
+ * 管理定时任务
+ * 
+ * @author sunyj
+ * @since 2016年12月13日 上午8:46:53
+ */
+public interface DailyTaskService {
+	/**
+	 * 建立每天定时任务
+	 * 
+	 * @param dailyTaskInformation
+	 *            每天定时任务的信息
+	 */
+	public void newDailyTask(DailyTaskInformation dailyTaskInformation);
+
+	/**
+	 * 保存日志到本地文件
+	 * 
+	 * @param log
+	 */
+	public void saveLog(DailyTaskLog log);
+
+	/**
+	 * 获取定时任务信息
+	 * 
+	 * @return
+	 */
+	public List<DailyTaskInformation> allDailyTaskInformations();
+
+	/**
+	 * 开启定时任务
+	 * 
+	 * @return 返回的结果
+	 */
+	public String start();
+
+	/**
+	 * 关闭定时任务
+	 * 
+	 * @return 返回的结果
+	 */
+	public String stop();
+
+	/**
+	 * 定时任务是否停止
+	 * 
+	 * @return
+	 */
+	public boolean isStopped();
+}

+ 77 - 27
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/DailyTaskManager.java → search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/DailyTaskServiceImpl.java

@@ -1,6 +1,5 @@
 package com.uas.search.console.b2b.schedule;
 
-import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -13,10 +12,12 @@ import java.util.concurrent.TimeUnit;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.alibaba.fastjson.JSONObject;
+import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.console.b2b.core.util.PathUtils;
 import com.uas.search.console.b2b.schedule.model.DailyTaskInformation;
 import com.uas.search.console.b2b.schedule.model.DailyTaskLog;
@@ -27,51 +28,50 @@ import com.uas.search.console.b2b.schedule.model.DailyTaskLog;
  * @author sunyj
  * @since 2016年12月12日 上午11:40:00
  */
-public class DailyTaskManager {
+@Service
+public class DailyTaskServiceImpl implements DailyTaskService {
 
 	private List<DailyTaskInformation> dailyTaskInformations = new ArrayList<>();
 
 	private ScheduledExecutorService scheduledExecutorService;
 
-	private Logger logger = LoggerFactory.getLogger(DailyTaskManager.class);
+	private Logger logger = LoggerFactory.getLogger(DailyTaskServiceImpl.class);
 
 	/**
 	 * 一天的毫秒数
 	 */
 	private static final long MILLISECONDS_OF_ONE_DAY = 24 * 60 * 60 * 1000;
 
-	/**
-	 * 建立每天定时任务
-	 * 
-	 * @param dailyTaskInformation
-	 *            每天定时任务的信息
-	 */
+	@Override
 	public void newDailyTask(DailyTaskInformation dailyTaskInformation) {
 		if (dailyTaskInformation == null || StringUtils.isEmpty(dailyTaskInformation.getTitle())
 				|| dailyTaskInformation.getCommand() == null) {
 			throw new NullPointerException();
 		}
+		if(containsDailyTask(dailyTaskInformation)){
+			throw new SearchException("任务已存在:"+dailyTaskInformation);
+		}
 		dailyTaskInformations.add(dailyTaskInformation);
-		recreateTasks();
+		stop();
+		start();
 	}
 
 	/**
-	 * 重新创建所有任务
+	 * 判断定时任务是否已经存在
+	 * 
+	 * @param dailyTaskInformation
+	 * @return
 	 */
-	private void recreateTasks() {
-		if (scheduledExecutorService != null) {
-			logger.info("Remove old daily tasks...");
-			scheduledExecutorService.shutdownNow();
+	private boolean containsDailyTask(DailyTaskInformation dailyTaskInformation) {
+		if (CollectionUtils.isEmpty(dailyTaskInformations)) {
+			return false;
 		}
-		if (!CollectionUtils.isEmpty(dailyTaskInformations)) {
-			// 线程数与任务数保持一致,这样保证任务间不会互相影响
-			scheduledExecutorService = Executors.newScheduledThreadPool(dailyTaskInformations.size());
-			for (DailyTaskInformation dailyTaskInformation : dailyTaskInformations) {
-				logger.info("New daily task: " + dailyTaskInformation);
-				newDailyTask(dailyTaskInformation.getCommand(), dailyTaskInformation.getHour(),
-						dailyTaskInformation.getMinute(), dailyTaskInformation.getSecond());
+		for (DailyTaskInformation d : dailyTaskInformations) {
+			if (dailyTaskInformation.equals(d)) {
+				return true;
 			}
 		}
+		return false;
 	}
 
 	/**
@@ -102,11 +102,7 @@ public class DailyTaskManager {
 
 	}
 
-	/**
-	 * 保存日志到本地文件
-	 * 
-	 * @param log
-	 */
+	@Override
 	public void saveLog(DailyTaskLog log) {
 		if (log == null) {
 			throw new NullPointerException();
@@ -130,4 +126,58 @@ public class DailyTaskManager {
 		}
 	}
 
+	@Override
+	public List<DailyTaskInformation> allDailyTaskInformations() {
+		return dailyTaskInformations;
+	}
+
+	@Override
+	public String start() {
+		String message = "";
+		if (!isStopped()) {
+			message = "已存在运行的定时任务";
+			logger.error(message);
+			return message;
+		}
+		if (!CollectionUtils.isEmpty(dailyTaskInformations)) {
+			// 线程数与任务数保持一致,这样保证任务间不会互相影响
+			scheduledExecutorService = Executors.newScheduledThreadPool(dailyTaskInformations.size());
+			for (DailyTaskInformation dailyTaskInformation : dailyTaskInformations) {
+				logger.info("New daily task: " + dailyTaskInformation);
+				newDailyTask(dailyTaskInformation.getCommand(), dailyTaskInformation.getHour(),
+						dailyTaskInformation.getMinute(), dailyTaskInformation.getSecond());
+			}
+			message = "已开启定时任务:" + dailyTaskInformations;
+			logger.info(message + "\n");
+			return message;
+		} else {
+			message = "定时任务为空";
+			logger.error(message + "\n");
+			return message;
+		}
+	}
+
+	@Override
+	public String stop() {
+		String message = "";
+		if (isStopped()) {
+			message = "定时任务已经停止或者未开启过";
+			logger.error(message);
+			return message;
+		}
+		logger.info("Remove old daily tasks...");
+		scheduledExecutorService.shutdownNow();
+		message = "已关闭定时任务";
+		logger.info(message + "\n");
+		return message;
+	}
+
+	@Override
+	public boolean isStopped() {
+		if (scheduledExecutorService == null) {
+			return true;
+		}
+		return scheduledExecutorService.isShutdown() || scheduledExecutorService.isTerminated();
+	}
+
 }

+ 17 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/model/DailyTaskInformation.java

@@ -1,5 +1,7 @@
 package com.uas.search.console.b2b.schedule.model;
 
+import java.util.Objects;
+
 /**
  * 每天定时任务
  * 
@@ -24,7 +26,7 @@ public class DailyTaskInformation {
 	private int hour;
 
 	/**
-	 * 执行时间中的小时
+	 * 执行时间中的分钟
 	 */
 	private int minute;
 
@@ -86,6 +88,20 @@ public class DailyTaskInformation {
 		this.second = second;
 	}
 
+	@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(title, other.getTitle()) && hour == other.getHour() && minute == other.getMinute()
+				&& second == other.getSecond();
+	}
+
 	@Override
 	public String toString() {
 		return "DailyTaskInformation [title=" + title + ", command=" + command + ", hour=" + hour + ", minute=" + minute

+ 12 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/PurchaseInquiryMouldSimpleInfoService.java

@@ -10,4 +10,16 @@ public interface PurchaseInquiryMouldSimpleInfoService {
 	 * 更新虚拟列的索引
 	 */
 	public void updateOverdue();
+
+	/**
+	 * 开启更新虚拟列的索引的定时任务
+	 * 
+	 * @param hour
+	 *            任务时间:小时
+	 * @param minute
+	 *            任务时间:分钟
+	 * @param second
+	 *            任务时间:秒
+	 */
+	public void startUpdateOverdueDailyTask(Integer hour, Integer minute, Integer second);
 }

+ 30 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/PurchaseInquiryMouldSimpleInfoServiceImpl.java

@@ -17,6 +17,9 @@ import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
 import com.uas.search.console.b2b.core.util.ContextUtils;
 import com.uas.search.console.b2b.model.PurchaseInquiryMouldSimpleInfo;
+import com.uas.search.console.b2b.schedule.DailyTaskService;
+import com.uas.search.console.b2b.schedule.model.DailyTaskInformation;
+import com.uas.search.console.b2b.schedule.model.DailyTaskLog;
 import com.uas.search.console.b2b.service.IndexService;
 import com.uas.search.console.b2b.service.InnerSearchService;
 import com.uas.search.console.b2b.service.PurchaseInquiryMouldSimpleInfoService;
@@ -40,6 +43,9 @@ public class PurchaseInquiryMouldSimpleInfoServiceImpl implements PurchaseInquir
 	 */
 	private static final int PAGE_SIZE = 1000;
 
+	@Autowired
+	private DailyTaskService dailyTaskService;
+
 	@Autowired
 	private IndexService indexService;
 
@@ -50,7 +56,8 @@ public class PurchaseInquiryMouldSimpleInfoServiceImpl implements PurchaseInquir
 
 	@Override
 	public void updateOverdue() {
-		// 不能边更新索引边分页获取索引中的数据,因为索引更新后,分页顺序可能也会变化,索引要先把数据保存到本地,等待全部获取之后重建索引
+		// 不能边更新索引边分页获取索引中的数据,因为索引更新后,分页顺序可能也会变化,
+		// 所以要先把数据保存到本地,等待全部获取之后重建索引
 		Long startTime = new Date().getTime();
 		Table_name tableName = ClassAndTableNameUtils.toTableName(PurchaseInquiryMouldSimpleInfo.class);
 
@@ -103,4 +110,26 @@ public class PurchaseInquiryMouldSimpleInfoServiceImpl implements PurchaseInquir
 		indexService.createIndexs(Arrays.asList(tableName), true);
 	}
 
+	@Override
+	public void startUpdateOverdueDailyTask(Integer hour, Integer minute, Integer second) {
+		if (hour == null || minute == null || second == null) {
+			throw new NullPointerException();
+		}
+		final DailyTaskInformation dailyTaskInformation = new DailyTaskInformation();
+		dailyTaskInformation.setTitle("更新虚拟列索引:模具询价单");
+		dailyTaskInformation.setHour(hour);
+		dailyTaskInformation.setMinute(minute);
+		dailyTaskInformation.setSecond(second);
+		dailyTaskInformation.setCommand(new Runnable() {
+			@Override
+			public void run() {
+				logger.info("Daily Task run...");
+				updateOverdue();
+				DailyTaskLog dailyTaskLog = new DailyTaskLog(dailyTaskInformation, new Date(), "success");
+				dailyTaskService.saveLog(dailyTaskLog);
+			}
+		});
+		dailyTaskService.newDailyTask(dailyTaskInformation);
+	}
+
 }

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

@@ -46,7 +46,12 @@
 
 			<strong><li class="title">定时任务</li></strong>
 			<ol>
-				<li><a target="_blank">schedule/updateOverdue?title=更新虚拟列索引:PURC$INQUIRYMOULD.im_overdue&hour=20&minute=16&second=0</a></li>
+				<li><a target="_blank">schedule/updateOverdue?hour=20&minute=16&second=0</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>
+				<li><a target="_blank">schedule/restart</a></li>
+				<li><a target="_blank">schedule/isStopped</a></li>
 			</ol>
 
 		</ol>