Pārlūkot izejas kodu

update .gitignore

wangwei 7 gadi atpakaļ
vecāks
revīzija
ff8e88bce4
34 mainītis faili ar 1666 papildinājumiem un 1617 dzēšanām
  1. 1 0
      .gitignore
  2. 0 17
      .project
  3. 21 21
      examcloud-task-api-provider/pom.xml
  4. 85 85
      examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/JobController.java
  5. 17 17
      examcloud-task-api/pom.xml
  6. 27 27
      examcloud-task-base/pom.xml
  7. 61 61
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/AbstractTask.java
  8. 47 47
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/DistributionJob.java
  9. 261 261
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/QuartzManager.java
  10. 115 115
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/ScheduleJob.java
  11. 18 18
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/StatefulDistributionJob.java
  12. 22 22
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/Task.java
  13. 43 43
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/TaskTracker.java
  14. 16 16
      examcloud-task-dao/pom.xml
  15. 17 17
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/ScheduleJobRepo.java
  16. 17 17
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/TaskTraceRepo.java
  17. 128 128
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ScheduleJobEntity.java
  18. 104 104
      examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/TaskTraceEntity.java
  19. 21 21
      examcloud-task-service/pom.xml
  20. 61 61
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/DefaultTaskTracker.java
  21. 38 38
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/OeCleanExamRecordTask.java
  22. 2 0
      examcloud-task-starter/.logs/interface/task.interface.log
  23. 94 0
      examcloud-task-starter/.logs/task/task.log
  24. 97 97
      examcloud-task-starter/pom.xml
  25. 91 91
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/TaskApp.java
  26. 83 83
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/DefaultWebMvcConfigurerAdapter.java
  27. 41 41
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/JobsInitialization.java
  28. 23 23
      examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/JobsInitializationListener.java
  29. 7 7
      examcloud-task-starter/src/main/resources/application-dev.properties
  30. 27 27
      examcloud-task-starter/src/main/resources/application.properties
  31. 77 77
      examcloud-task-starter/src/main/resources/logback-spring.xml
  32. 3 3
      examcloud-task-starter/src/main/resources/security-exclusions.conf
  33. 1 1
      examcloud-task-starter/src/main/resources/security-mapping.properties
  34. 0 31
      examcloud-task-starter/src/test/java/cn/com/qmth/task/TestTaskSchedule.java

+ 1 - 0
.gitignore

@@ -10,3 +10,4 @@ target/
 logs/
 
 
+

+ 0 - 17
.project

@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>examcloud-task</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>

+ 21 - 21
examcloud-task-api-provider/pom.xml

@@ -1,22 +1,22 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.task</groupId>
-		<artifactId>examcloud-task</artifactId>
-		<version>2.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-task-api-provider</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.task</groupId>
-			<artifactId>examcloud-task-service</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.task</groupId>
-			<artifactId>examcloud-task-api</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.task</groupId>
+		<artifactId>examcloud-task</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-task-api-provider</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.task</groupId>
+			<artifactId>examcloud-task-service</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.task</groupId>
+			<artifactId>examcloud-task-api</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
 </project>

+ 85 - 85
examcloud-task-api-provider/src/main/java/cn/com/qmth/examcloud/task/api/controller/JobController.java

@@ -1,85 +1,85 @@
-package cn.com.qmth.examcloud.task.api.controller;
-
-import javax.transaction.Transactional;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import cn.com.qmth.examcloud.commons.base.exception.StatusException;
-import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
-import cn.com.qmth.examcloud.task.base.QuartzManager;
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-import cn.com.qmth.examcloud.task.dao.ScheduleJobRepo;
-import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
-import io.swagger.annotations.ApiOperation;
-
-@Transactional
-@RestController
-@RequestMapping("${$rmp.ctr.task}" + "job")
-public class JobController extends ControllerSupport {
-
-	@Autowired
-	private ScheduleJobRepo scheduleJobEntityRepo;
-
-	@Autowired
-	private QuartzManager quartzManager;
-
-	@ApiOperation(value = "启动job")
-	@PostMapping("/executeJob/{jobName}")
-	public void executeJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.addJob(scheduleJob);
-	}
-
-	@ApiOperation(value = "暂停job")
-	@PostMapping("/pauseJob/{jobName}")
-	public void pauseJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.pauseJob(scheduleJob);
-	}
-
-	@ApiOperation(value = "从暂停中恢复job")
-	@PostMapping("/resumeJob/{jobName}")
-	public void resumeJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.resumeJob(scheduleJob);
-	}
-
-	@ApiOperation(value = "删除job")
-	@PostMapping("/deleteJob/{jobName}")
-	public void deleteJob(@PathVariable String jobName) {
-		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
-		quartzManager.deleteJob(scheduleJob);
-	}
-
-	/**
-	 * 获取可用job
-	 *
-	 * @author WANGWEI
-	 * @param jobName
-	 * @return
-	 */
-	private ScheduleJob getEnableScheduleJob(String jobName) {
-		ScheduleJobEntity jobEntity = scheduleJobEntityRepo.findByJobName(jobName);
-		if (null == jobEntity) {
-			throw new StatusException("T-100001", "任务不存在");
-		}
-
-		if (!jobEntity.getEnable()) {
-			throw new StatusException("T-100001", "任务被禁用");
-		}
-
-		ScheduleJob scheduleJob = new ScheduleJob();
-		scheduleJob.setJobName(jobEntity.getJobName());
-		scheduleJob.setJobGroup(jobEntity.getJobGroup());
-		scheduleJob.setSpringBean(jobEntity.getSpringBean());
-		scheduleJob.setCronExpression(jobEntity.getCronExpression());
-		scheduleJob.setStateful(jobEntity.getStateful());
-
-		return scheduleJob;
-	}
-
-}
+package cn.com.qmth.examcloud.task.api.controller;
+
+import javax.transaction.Transactional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
+import cn.com.qmth.examcloud.task.base.QuartzManager;
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.dao.ScheduleJobRepo;
+import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
+import io.swagger.annotations.ApiOperation;
+
+@Transactional
+@RestController
+@RequestMapping("${$rmp.ctr.task}" + "job")
+public class JobController extends ControllerSupport {
+
+	@Autowired
+	private ScheduleJobRepo scheduleJobEntityRepo;
+
+	@Autowired
+	private QuartzManager quartzManager;
+
+	@ApiOperation(value = "启动job")
+	@PostMapping("/executeJob/{jobName}")
+	public void executeJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.addJob(scheduleJob);
+	}
+
+	@ApiOperation(value = "暂停job")
+	@PostMapping("/pauseJob/{jobName}")
+	public void pauseJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.pauseJob(scheduleJob);
+	}
+
+	@ApiOperation(value = "从暂停中恢复job")
+	@PostMapping("/resumeJob/{jobName}")
+	public void resumeJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.resumeJob(scheduleJob);
+	}
+
+	@ApiOperation(value = "删除job")
+	@PostMapping("/deleteJob/{jobName}")
+	public void deleteJob(@PathVariable String jobName) {
+		ScheduleJob scheduleJob = getEnableScheduleJob(jobName);
+		quartzManager.deleteJob(scheduleJob);
+	}
+
+	/**
+	 * 获取可用job
+	 *
+	 * @author WANGWEI
+	 * @param jobName
+	 * @return
+	 */
+	private ScheduleJob getEnableScheduleJob(String jobName) {
+		ScheduleJobEntity jobEntity = scheduleJobEntityRepo.findByJobName(jobName);
+		if (null == jobEntity) {
+			throw new StatusException("T-100001", "任务不存在");
+		}
+
+		if (!jobEntity.getEnable()) {
+			throw new StatusException("T-100001", "任务被禁用");
+		}
+
+		ScheduleJob scheduleJob = new ScheduleJob();
+		scheduleJob.setJobName(jobEntity.getJobName());
+		scheduleJob.setJobGroup(jobEntity.getJobGroup());
+		scheduleJob.setSpringBean(jobEntity.getSpringBean());
+		scheduleJob.setCronExpression(jobEntity.getCronExpression());
+		scheduleJob.setStateful(jobEntity.getStateful());
+
+		return scheduleJob;
+	}
+
+}

+ 17 - 17
examcloud-task-api/pom.xml

@@ -1,18 +1,18 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>cn.com.qmth.examcloud.task</groupId>
-    <artifactId>examcloud-task</artifactId>
-    <version>2.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>examcloud-task-api</artifactId>
-  
-  <dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.commons</groupId>
-			<artifactId>examcloud-commons-web</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-  </dependencies>		
-  
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>cn.com.qmth.examcloud.task</groupId>
+    <artifactId>examcloud-task</artifactId>
+    <version>2.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>examcloud-task-api</artifactId>
+  
+  <dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.commons</groupId>
+			<artifactId>examcloud-commons-web</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+  </dependencies>		
+  
 </project>

+ 27 - 27
examcloud-task-base/pom.xml

@@ -1,28 +1,28 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.task</groupId>
-		<artifactId>examcloud-task</artifactId>
-		<version>2.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-task-base</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.commons</groupId>
-			<artifactId>examcloud-commons-web</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.quartz-scheduler</groupId>
-			<artifactId>quartz</artifactId>
-			<version>2.2.1</version>
-		</dependency>
-		<dependency>
-			<groupId>org.quartz-scheduler</groupId>
-			<artifactId>quartz-jobs</artifactId>
-			<version>2.2.1</version>
-		</dependency>
-	</dependencies>
-
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.task</groupId>
+		<artifactId>examcloud-task</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-task-base</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.commons</groupId>
+			<artifactId>examcloud-commons-web</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.quartz-scheduler</groupId>
+			<artifactId>quartz</artifactId>
+			<version>2.2.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.quartz-scheduler</groupId>
+			<artifactId>quartz-jobs</artifactId>
+			<version>2.2.1</version>
+		</dependency>
+	</dependencies>
+
 </project>

+ 61 - 61
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/AbstractTask.java

@@ -1,61 +1,61 @@
-package cn.com.qmth.examcloud.task.base;
-
-import org.quartz.JobExecutionContext;
-
-import cn.com.qmth.examcloud.commons.base.exception.ExamCloudRuntimeException;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-
-/**
- * 任务调度抽象类
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-public abstract class AbstractTask implements Task {
-
-	protected ExamCloudLog taskLog = ExamCloudLogFactory.getLog("TASK_LOGGER");
-
-	protected ExamCloudLog debugLog = ExamCloudLogFactory.getLog(this.getClass());
-
-	public abstract TaskTracker getTaskTracker();
-
-	public abstract void run(ScheduleJob scheduleJob) throws Exception;
-
-	@Override
-	public void execute(JobExecutionContext context, ScheduleJob scheduleJob, String traceId) {
-		try {
-			getTaskTracker().start(context, scheduleJob, traceId);
-		} catch (Exception e) {
-			taskLog.error("[TASK TRACKER]. start", e);
-		}
-		if (taskLog.isDebugEnabled()) {
-			taskLog.debug("[TASK IN]. detail: " + JsonUtil.toJson(scheduleJob));
-		}
-		try {
-			run(scheduleJob);
-		} catch (Exception e) {
-			try {
-				getTaskTracker().whenException(context, scheduleJob, traceId, e);
-			} catch (Exception ex) {
-				taskLog.error("[TASK TRACKER]. whenException", ex);
-			}
-			if (taskLog.isErrorEnabled()) {
-				taskLog.error("[TASK EXCEPTION]. detail: " + JsonUtil.toJson(scheduleJob), e);
-			}
-			throw new ExamCloudRuntimeException(e);
-		}
-		try {
-			getTaskTracker().onEnd(context, scheduleJob, traceId);
-		} catch (Exception e) {
-			taskLog.error("[TASK TRACKER]. onEnd", e);
-		}
-		if (taskLog.isDebugEnabled()) {
-			taskLog.debug("[TASK OUT]. detail: " + JsonUtil.toJson(scheduleJob));
-		}
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.base;
+
+import org.quartz.JobExecutionContext;
+
+import cn.com.qmth.examcloud.commons.base.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
+
+/**
+ * 任务调度抽象类
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+public abstract class AbstractTask implements Task {
+
+	protected ExamCloudLog taskLog = ExamCloudLogFactory.getLog("TASK_LOGGER");
+
+	protected ExamCloudLog debugLog = ExamCloudLogFactory.getLog(this.getClass());
+
+	public abstract TaskTracker getTaskTracker();
+
+	public abstract void run(ScheduleJob scheduleJob) throws Exception;
+
+	@Override
+	public void execute(JobExecutionContext context, ScheduleJob scheduleJob, String traceId) {
+		try {
+			getTaskTracker().start(context, scheduleJob, traceId);
+		} catch (Exception e) {
+			taskLog.error("[TASK TRACKER]. start", e);
+		}
+		if (taskLog.isDebugEnabled()) {
+			taskLog.debug("[TASK IN]. detail: " + JsonUtil.toJson(scheduleJob));
+		}
+		try {
+			run(scheduleJob);
+		} catch (Exception e) {
+			try {
+				getTaskTracker().whenException(context, scheduleJob, traceId, e);
+			} catch (Exception ex) {
+				taskLog.error("[TASK TRACKER]. whenException", ex);
+			}
+			if (taskLog.isErrorEnabled()) {
+				taskLog.error("[TASK EXCEPTION]. detail: " + JsonUtil.toJson(scheduleJob), e);
+			}
+			throw new ExamCloudRuntimeException(e);
+		}
+		try {
+			getTaskTracker().onEnd(context, scheduleJob, traceId);
+		} catch (Exception e) {
+			taskLog.error("[TASK TRACKER]. onEnd", e);
+		}
+		if (taskLog.isDebugEnabled()) {
+			taskLog.debug("[TASK OUT]. detail: " + JsonUtil.toJson(scheduleJob));
+		}
+
+	}
+
+}

+ 47 - 47
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/DistributionJob.java

@@ -1,47 +1,47 @@
-package cn.com.qmth.examcloud.task.base;
-
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-import cn.com.qmth.examcloud.commons.base.util.ThreadLocalUtil;
-import cn.com.qmth.examcloud.commons.web.support.SpringContextHolder;
-
-/**
- * 并行任务分发器
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-public class DistributionJob implements Job {
-	private static final ExamCloudLog TASK_LOG = ExamCloudLogFactory.getLog("TASK_LOGGER");
-
-	@Override
-	public void execute(JobExecutionContext context) throws JobExecutionException {
-		String traceId = ThreadLocalUtil.next();
-		ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
-
-		if (TASK_LOG.isDebugEnabled()) {
-			TASK_LOG.debug("distribute job. job detail :" + JsonUtil.toJson(scheduleJob));
-		}
-
-		try {
-			Object bean = SpringContextHolder.getBean(scheduleJob.getSpringBean());
-
-			Task task = (Task) bean;
-			task.execute(context, scheduleJob, traceId);
-		} catch (Exception e) {
-			if (TASK_LOG.isErrorEnabled()) {
-				TASK_LOG.error(
-						"fail to distribute job. job detail :" + JsonUtil.toJson(scheduleJob), e);
-			}
-			throw new JobExecutionException(e);
-		}
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.base;
+
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
+import cn.com.qmth.examcloud.commons.base.util.ThreadLocalUtil;
+import cn.com.qmth.examcloud.commons.web.support.SpringContextHolder;
+
+/**
+ * 并行任务分发器
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+public class DistributionJob implements Job {
+	private static final ExamCloudLog TASK_LOG = ExamCloudLogFactory.getLog("TASK_LOGGER");
+
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		String traceId = ThreadLocalUtil.next();
+		ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
+
+		if (TASK_LOG.isDebugEnabled()) {
+			TASK_LOG.debug("distribute job. job detail :" + JsonUtil.toJson(scheduleJob));
+		}
+
+		try {
+			Object bean = SpringContextHolder.getBean(scheduleJob.getSpringBean());
+
+			Task task = (Task) bean;
+			task.execute(context, scheduleJob, traceId);
+		} catch (Exception e) {
+			if (TASK_LOG.isErrorEnabled()) {
+				TASK_LOG.error(
+						"fail to distribute job. job detail :" + JsonUtil.toJson(scheduleJob), e);
+			}
+			throw new JobExecutionException(e);
+		}
+
+	}
+
+}

+ 261 - 261
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/QuartzManager.java

@@ -1,262 +1,262 @@
-package cn.com.qmth.examcloud.task.base;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import org.quartz.CronScheduleBuilder;
-import org.quartz.CronTrigger;
-import org.quartz.Job;
-import org.quartz.JobBuilder;
-import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobKey;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.Trigger;
-import org.quartz.TriggerBuilder;
-import org.quartz.TriggerKey;
-import org.quartz.impl.matchers.GroupMatcher;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.commons.base.exception.ExamCloudRuntimeException;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
-
-/**
- * Quartz 管理器
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-@Component
-public class QuartzManager {
-	private static final ExamCloudLog TASK_LOG = ExamCloudLogFactory.getLog("TASK_LOGGER");
-
-	@Autowired
-	private SchedulerFactoryBean schedulerFactoryBean;
-
-	/**
-	 * 添加任务
-	 *
-	 * @author WANGWEI
-	 * @param job
-	 */
-	public void addJob(ScheduleJob job) {
-		if (TASK_LOG.isDebugEnabled()) {
-			TASK_LOG.debug("add a job. job detail: " + JsonUtil.toJson(job));
-		}
-
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
-
-			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
-
-			if (null == trigger) {
-				Class<? extends Job> jobClass = job.isStateful()
-						? StatefulDistributionJob.class
-						: DistributionJob.class;
-				JobDetail jobDetail = JobBuilder.newJob(jobClass)
-						.withIdentity(job.getJobName(), job.getJobGroup()).build();
-
-				jobDetail.getJobDataMap().put("scheduleJob", job);
-
-				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
-						.cronSchedule(job.getCronExpression());
-
-				trigger = TriggerBuilder.newTrigger()
-						.withIdentity(job.getJobName(), job.getJobGroup())
-						.withSchedule(scheduleBuilder).build();
-
-				scheduler.scheduleJob(jobDetail, trigger);
-			} else {
-				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
-						.cronSchedule(job.getCronExpression());
-
-				trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
-						.withSchedule(scheduleBuilder).build();
-
-				scheduler.rescheduleJob(triggerKey, trigger);
-			}
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to add a job. job detail: " + JsonUtil.toJson(job), e);
-			throw new ExamCloudRuntimeException(e);
-		}
-
-		if (TASK_LOG.isDebugEnabled()) {
-			TASK_LOG.debug("add a job successfully. job detail: " + JsonUtil.toJson(job));
-		}
-	}
-
-	/**
-	 * 获取所有计划中的任务列表
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public List<ScheduleJob> getAllJobs() {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
-			Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
-			List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
-			for (JobKey jobKey : jobKeys) {
-				List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
-				for (Trigger trigger : triggers) {
-					ScheduleJob job = new ScheduleJob();
-					job.setJobName(jobKey.getName());
-					job.setJobGroup(jobKey.getGroup());
-					Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
-					job.setTriggerState(triggerState.name());
-					if (trigger instanceof CronTrigger) {
-						CronTrigger cronTrigger = (CronTrigger) trigger;
-						String cronExpression = cronTrigger.getCronExpression();
-						job.setCronExpression(cronExpression);
-					}
-					jobList.add(job);
-				}
-			}
-			return jobList;
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to get all jobs.", e);
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * 所有正在运行的job
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public List<ScheduleJob> getRunningJobs() {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
-			List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
-			for (JobExecutionContext context : executingJobs) {
-				ScheduleJob job = new ScheduleJob();
-				JobDetail jobDetail = context.getJobDetail();
-				JobKey jobKey = jobDetail.getKey();
-				Trigger trigger = context.getTrigger();
-				job.setJobName(jobKey.getName());
-				job.setJobGroup(jobKey.getGroup());
-				Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
-				job.setTriggerState(triggerState.name());
-				if (trigger instanceof CronTrigger) {
-					CronTrigger cronTrigger = (CronTrigger) trigger;
-					String cronExpression = cronTrigger.getCronExpression();
-					job.setCronExpression(cronExpression);
-				}
-				jobList.add(job);
-			}
-			return jobList;
-		} catch (Exception e) {
-			TASK_LOG.error("Fail to get running jobs.", e);
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * 暂停一个job
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 */
-	public void pauseJob(ScheduleJob scheduleJob) {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
-			scheduler.pauseJob(jobKey);
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to pause Job. job detail: " + JsonUtil.toJson(scheduleJob), e);
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * 恢复一个job
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 */
-	public void resumeJob(ScheduleJob scheduleJob) {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
-			scheduler.resumeJob(jobKey);
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to resume job. job detail: " + JsonUtil.toJson(scheduleJob), e);
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * 删除一个job
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 */
-	public void deleteJob(ScheduleJob scheduleJob) {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
-			scheduler.deleteJob(jobKey);
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to delete job. job detail: " + JsonUtil.toJson(scheduleJob), e);
-			throw new ExamCloudRuntimeException(e);
-		}
-
-	}
-
-	/**
-	 * 执行job
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 */
-	public void runJob(ScheduleJob scheduleJob) {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
-			scheduler.triggerJob(jobKey);
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to run job. job detail: " + JsonUtil.toJson(scheduleJob), e);
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * 更新job时间表达式
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 */
-	public void updateJobCronExpression(ScheduleJob scheduleJob) {
-		try {
-			Scheduler scheduler = schedulerFactoryBean.getScheduler();
-
-			TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
-					scheduleJob.getJobGroup());
-
-			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
-
-			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
-					.cronSchedule(scheduleJob.getCronExpression());
-
-			trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
-					.withSchedule(scheduleBuilder).build();
-
-			scheduler.rescheduleJob(triggerKey, trigger);
-		} catch (SchedulerException e) {
-			TASK_LOG.error("Fail to update job cron expression. job detail :"
-					+ JsonUtil.toJson(scheduleJob), e);
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
+package cn.com.qmth.examcloud.task.base;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.quartz.CronScheduleBuilder;
+import org.quartz.CronTrigger;
+import org.quartz.Job;
+import org.quartz.JobBuilder;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobKey;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
+import org.quartz.TriggerBuilder;
+import org.quartz.TriggerKey;
+import org.quartz.impl.matchers.GroupMatcher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.commons.base.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
+
+/**
+ * Quartz 管理器
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@Component
+public class QuartzManager {
+	private static final ExamCloudLog TASK_LOG = ExamCloudLogFactory.getLog("TASK_LOGGER");
+
+	@Autowired
+	private SchedulerFactoryBean schedulerFactoryBean;
+
+	/**
+	 * 添加任务
+	 *
+	 * @author WANGWEI
+	 * @param job
+	 */
+	public void addJob(ScheduleJob job) {
+		if (TASK_LOG.isDebugEnabled()) {
+			TASK_LOG.debug("add a job. job detail: " + JsonUtil.toJson(job));
+		}
+
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
+
+			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+
+			if (null == trigger) {
+				Class<? extends Job> jobClass = job.isStateful()
+						? StatefulDistributionJob.class
+						: DistributionJob.class;
+				JobDetail jobDetail = JobBuilder.newJob(jobClass)
+						.withIdentity(job.getJobName(), job.getJobGroup()).build();
+
+				jobDetail.getJobDataMap().put("scheduleJob", job);
+
+				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
+						.cronSchedule(job.getCronExpression());
+
+				trigger = TriggerBuilder.newTrigger()
+						.withIdentity(job.getJobName(), job.getJobGroup())
+						.withSchedule(scheduleBuilder).build();
+
+				scheduler.scheduleJob(jobDetail, trigger);
+			} else {
+				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
+						.cronSchedule(job.getCronExpression());
+
+				trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
+						.withSchedule(scheduleBuilder).build();
+
+				scheduler.rescheduleJob(triggerKey, trigger);
+			}
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to add a job. job detail: " + JsonUtil.toJson(job), e);
+			throw new ExamCloudRuntimeException(e);
+		}
+
+		if (TASK_LOG.isDebugEnabled()) {
+			TASK_LOG.debug("add a job successfully. job detail: " + JsonUtil.toJson(job));
+		}
+	}
+
+	/**
+	 * 获取所有计划中的任务列表
+	 *
+	 * @author WANGWEI
+	 * @return
+	 */
+	public List<ScheduleJob> getAllJobs() {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
+			Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
+			List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
+			for (JobKey jobKey : jobKeys) {
+				List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
+				for (Trigger trigger : triggers) {
+					ScheduleJob job = new ScheduleJob();
+					job.setJobName(jobKey.getName());
+					job.setJobGroup(jobKey.getGroup());
+					Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
+					job.setTriggerState(triggerState.name());
+					if (trigger instanceof CronTrigger) {
+						CronTrigger cronTrigger = (CronTrigger) trigger;
+						String cronExpression = cronTrigger.getCronExpression();
+						job.setCronExpression(cronExpression);
+					}
+					jobList.add(job);
+				}
+			}
+			return jobList;
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to get all jobs.", e);
+			throw new ExamCloudRuntimeException(e);
+		}
+	}
+
+	/**
+	 * 所有正在运行的job
+	 *
+	 * @author WANGWEI
+	 * @return
+	 */
+	public List<ScheduleJob> getRunningJobs() {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
+			List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
+			for (JobExecutionContext context : executingJobs) {
+				ScheduleJob job = new ScheduleJob();
+				JobDetail jobDetail = context.getJobDetail();
+				JobKey jobKey = jobDetail.getKey();
+				Trigger trigger = context.getTrigger();
+				job.setJobName(jobKey.getName());
+				job.setJobGroup(jobKey.getGroup());
+				Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
+				job.setTriggerState(triggerState.name());
+				if (trigger instanceof CronTrigger) {
+					CronTrigger cronTrigger = (CronTrigger) trigger;
+					String cronExpression = cronTrigger.getCronExpression();
+					job.setCronExpression(cronExpression);
+				}
+				jobList.add(job);
+			}
+			return jobList;
+		} catch (Exception e) {
+			TASK_LOG.error("Fail to get running jobs.", e);
+			throw new ExamCloudRuntimeException(e);
+		}
+	}
+
+	/**
+	 * 暂停一个job
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 */
+	public void pauseJob(ScheduleJob scheduleJob) {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
+			scheduler.pauseJob(jobKey);
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to pause Job. job detail: " + JsonUtil.toJson(scheduleJob), e);
+			throw new ExamCloudRuntimeException(e);
+		}
+	}
+
+	/**
+	 * 恢复一个job
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 */
+	public void resumeJob(ScheduleJob scheduleJob) {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
+			scheduler.resumeJob(jobKey);
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to resume job. job detail: " + JsonUtil.toJson(scheduleJob), e);
+			throw new ExamCloudRuntimeException(e);
+		}
+	}
+
+	/**
+	 * 删除一个job
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 */
+	public void deleteJob(ScheduleJob scheduleJob) {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
+			scheduler.deleteJob(jobKey);
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to delete job. job detail: " + JsonUtil.toJson(scheduleJob), e);
+			throw new ExamCloudRuntimeException(e);
+		}
+
+	}
+
+	/**
+	 * 执行job
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 */
+	public void runJob(ScheduleJob scheduleJob) {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+			JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
+			scheduler.triggerJob(jobKey);
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to run job. job detail: " + JsonUtil.toJson(scheduleJob), e);
+			throw new ExamCloudRuntimeException(e);
+		}
+	}
+
+	/**
+	 * 更新job时间表达式
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 */
+	public void updateJobCronExpression(ScheduleJob scheduleJob) {
+		try {
+			Scheduler scheduler = schedulerFactoryBean.getScheduler();
+
+			TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
+					scheduleJob.getJobGroup());
+
+			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+
+			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
+					.cronSchedule(scheduleJob.getCronExpression());
+
+			trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
+					.withSchedule(scheduleBuilder).build();
+
+			scheduler.rescheduleJob(triggerKey, trigger);
+		} catch (SchedulerException e) {
+			TASK_LOG.error("Fail to update job cron expression. job detail :"
+					+ JsonUtil.toJson(scheduleJob), e);
+			throw new ExamCloudRuntimeException(e);
+		}
+	}
 }

+ 115 - 115
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/ScheduleJob.java

@@ -1,116 +1,116 @@
-package cn.com.qmth.examcloud.task.base;
-
-import java.io.Serializable;
-
-/**
- * 任务配置
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-public class ScheduleJob implements Serializable {
-	private static final long serialVersionUID = -1638993747996917970L;
-
-	private Long jobId;
-
-	/**
-	 * 任务名称
-	 */
-	private String jobName;
-
-	/**
-	 * 任务分组
-	 */
-	private String jobGroup;
-
-	/**
-	 * 触发器状态
-	 */
-	private String triggerState;
-
-	/**
-	 * cron表达式
-	 */
-	private String cronExpression;
-
-	/**
-	 * 描述
-	 */
-	private String description;
-
-	/**
-	 * Spring bean
-	 */
-	private String springBean;
-
-	/**
-	 * 是否顺序执行
-	 */
-	private boolean stateful = true;
-
-	public Long getJobId() {
-		return jobId;
-	}
-
-	public void setJobId(Long jobId) {
-		this.jobId = jobId;
-	}
-
-	public String getJobName() {
-		return jobName;
-	}
-
-	public void setJobName(String jobName) {
-		this.jobName = jobName;
-	}
-
-	public String getJobGroup() {
-		return jobGroup;
-	}
-
-	public void setJobGroup(String jobGroup) {
-		this.jobGroup = jobGroup;
-	}
-
-	public String getTriggerState() {
-		return triggerState;
-	}
-
-	public void setTriggerState(String triggerState) {
-		this.triggerState = triggerState;
-	}
-
-	public String getCronExpression() {
-		return cronExpression;
-	}
-
-	public void setCronExpression(String cronExpression) {
-		this.cronExpression = cronExpression;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getSpringBean() {
-		return springBean;
-	}
-
-	public void setSpringBean(String springBean) {
-		this.springBean = springBean;
-	}
-
-	public boolean isStateful() {
-		return stateful;
-	}
-
-	public void setStateful(boolean stateful) {
-		this.stateful = stateful;
-	}
-
+package cn.com.qmth.examcloud.task.base;
+
+import java.io.Serializable;
+
+/**
+ * 任务配置
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+public class ScheduleJob implements Serializable {
+	private static final long serialVersionUID = -1638993747996917970L;
+
+	private Long jobId;
+
+	/**
+	 * 任务名称
+	 */
+	private String jobName;
+
+	/**
+	 * 任务分组
+	 */
+	private String jobGroup;
+
+	/**
+	 * 触发器状态
+	 */
+	private String triggerState;
+
+	/**
+	 * cron表达式
+	 */
+	private String cronExpression;
+
+	/**
+	 * 描述
+	 */
+	private String description;
+
+	/**
+	 * Spring bean
+	 */
+	private String springBean;
+
+	/**
+	 * 是否顺序执行
+	 */
+	private boolean stateful = true;
+
+	public Long getJobId() {
+		return jobId;
+	}
+
+	public void setJobId(Long jobId) {
+		this.jobId = jobId;
+	}
+
+	public String getJobName() {
+		return jobName;
+	}
+
+	public void setJobName(String jobName) {
+		this.jobName = jobName;
+	}
+
+	public String getJobGroup() {
+		return jobGroup;
+	}
+
+	public void setJobGroup(String jobGroup) {
+		this.jobGroup = jobGroup;
+	}
+
+	public String getTriggerState() {
+		return triggerState;
+	}
+
+	public void setTriggerState(String triggerState) {
+		this.triggerState = triggerState;
+	}
+
+	public String getCronExpression() {
+		return cronExpression;
+	}
+
+	public void setCronExpression(String cronExpression) {
+		this.cronExpression = cronExpression;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getSpringBean() {
+		return springBean;
+	}
+
+	public void setSpringBean(String springBean) {
+		this.springBean = springBean;
+	}
+
+	public boolean isStateful() {
+		return stateful;
+	}
+
+	public void setStateful(boolean stateful) {
+		this.stateful = stateful;
+	}
+
 }

+ 18 - 18
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/StatefulDistributionJob.java

@@ -1,18 +1,18 @@
-package cn.com.qmth.examcloud.task.base;
-
-import org.quartz.DisallowConcurrentExecution;
-import org.quartz.PersistJobDataAfterExecution;
-
-/**
- * 顺序执行任务分发器
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-@DisallowConcurrentExecution
-@PersistJobDataAfterExecution
-public class StatefulDistributionJob extends DistributionJob
-{
-
-}
+package cn.com.qmth.examcloud.task.base;
+
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.PersistJobDataAfterExecution;
+
+/**
+ * 顺序执行任务分发器
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@DisallowConcurrentExecution
+@PersistJobDataAfterExecution
+public class StatefulDistributionJob extends DistributionJob
+{
+
+}

+ 22 - 22
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/Task.java

@@ -1,22 +1,22 @@
-package cn.com.qmth.examcloud.task.base;
-
-import org.quartz.JobExecutionContext;
-
-/**
- * 任务接口
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-public interface Task {
-
-	/**
-	 * 执行任务
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 * @param traceId
-	 */
-	void execute(JobExecutionContext context, ScheduleJob scheduleJob, String traceId);
-}
+package cn.com.qmth.examcloud.task.base;
+
+import org.quartz.JobExecutionContext;
+
+/**
+ * 任务接口
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+public interface Task {
+
+	/**
+	 * 执行任务
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 * @param traceId
+	 */
+	void execute(JobExecutionContext context, ScheduleJob scheduleJob, String traceId);
+}

+ 43 - 43
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/TaskTracker.java

@@ -1,43 +1,43 @@
-package cn.com.qmth.examcloud.task.base;
-
-import org.quartz.JobExecutionContext;
-
-/**
- * 任务跟踪记载器
- *
- * @author WANGWEI
- * @date 2018年7月25日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public interface TaskTracker {
-
-	/**
-	 * 启动
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 * @param traceId
-	 */
-	void start(JobExecutionContext context, final ScheduleJob scheduleJob, final String traceId);
-
-	/**
-	 * 异常
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 * @param traceId
-	 * @param e
-	 */
-	void whenException(JobExecutionContext context, final ScheduleJob scheduleJob,
-			final String traceId, Exception e);
-
-	/**
-	 * 结束
-	 *
-	 * @author WANGWEI
-	 * @param scheduleJob
-	 * @param traceId
-	 */
-	void onEnd(JobExecutionContext context, final ScheduleJob scheduleJob, final String traceId);
-
-}
+package cn.com.qmth.examcloud.task.base;
+
+import org.quartz.JobExecutionContext;
+
+/**
+ * 任务跟踪记载器
+ *
+ * @author WANGWEI
+ * @date 2018年7月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public interface TaskTracker {
+
+	/**
+	 * 启动
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 * @param traceId
+	 */
+	void start(JobExecutionContext context, final ScheduleJob scheduleJob, final String traceId);
+
+	/**
+	 * 异常
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 * @param traceId
+	 * @param e
+	 */
+	void whenException(JobExecutionContext context, final ScheduleJob scheduleJob,
+			final String traceId, Exception e);
+
+	/**
+	 * 结束
+	 *
+	 * @author WANGWEI
+	 * @param scheduleJob
+	 * @param traceId
+	 */
+	void onEnd(JobExecutionContext context, final ScheduleJob scheduleJob, final String traceId);
+
+}

+ 16 - 16
examcloud-task-dao/pom.xml

@@ -1,17 +1,17 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.task</groupId>
-		<artifactId>examcloud-task</artifactId>
-		<version>2.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-task-dao</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.task</groupId>
-			<artifactId>examcloud-task-base</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.task</groupId>
+		<artifactId>examcloud-task</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-task-dao</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.task</groupId>
+			<artifactId>examcloud-task-base</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
 </project>

+ 17 - 17
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/ScheduleJobRepo.java

@@ -1,17 +1,17 @@
-package cn.com.qmth.examcloud.task.dao;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.stereotype.Repository;
-
-import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
-
-@Repository
-public interface ScheduleJobRepo
-		extends
-			JpaRepository<ScheduleJobEntity, Long>,
-			JpaSpecificationExecutor<ScheduleJobEntity> {
-
-	public ScheduleJobEntity findByJobName(String jobName);
-
-}
+package cn.com.qmth.examcloud.task.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
+
+@Repository
+public interface ScheduleJobRepo
+		extends
+			JpaRepository<ScheduleJobEntity, Long>,
+			JpaSpecificationExecutor<ScheduleJobEntity> {
+
+	public ScheduleJobEntity findByJobName(String jobName);
+
+}

+ 17 - 17
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/TaskTraceRepo.java

@@ -1,17 +1,17 @@
-package cn.com.qmth.examcloud.task.dao;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.stereotype.Repository;
-
-import cn.com.qmth.examcloud.task.dao.entity.TaskTraceEntity;
-
-@Repository
-public interface TaskTraceRepo
-		extends
-			JpaRepository<TaskTraceEntity, Long>,
-			JpaSpecificationExecutor<TaskTraceEntity> {
-
-	TaskTraceEntity findByTraceId(String traceId);
-
-}
+package cn.com.qmth.examcloud.task.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import cn.com.qmth.examcloud.task.dao.entity.TaskTraceEntity;
+
+@Repository
+public interface TaskTraceRepo
+		extends
+			JpaRepository<TaskTraceEntity, Long>,
+			JpaSpecificationExecutor<TaskTraceEntity> {
+
+	TaskTraceEntity findByTraceId(String traceId);
+
+}

+ 128 - 128
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/ScheduleJobEntity.java

@@ -1,129 +1,129 @@
-package cn.com.qmth.examcloud.task.dao.entity;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
-
-/**
- * 任务配置
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-@Entity
-@Table(name = "EC_T_SCHEDULE_JOB")
-public class ScheduleJobEntity extends JpaEntity {
-	private static final long serialVersionUID = -1638993747996917970L;
-
-	@Id
-	@GeneratedValue
-	private Long id;
-
-	/**
-	 * 任务名称
-	 */
-	@Column(unique = true, nullable = false)
-	private String jobName;
-
-	/**
-	 * 任务分组
-	 */
-	@Column(unique = false, nullable = false)
-	private String jobGroup;
-
-	/**
-	 * cron表达式
-	 */
-	@NotNull
-	private String cronExpression;
-
-	/**
-	 * 描述
-	 */
-	private String description;
-
-	/**
-	 * Spring bean
-	 */
-	@NotNull
-	private String springBean;
-
-	/**
-	 * 是否顺序执行
-	 */
-	private Boolean stateful;
-
-	@NotNull
-	private Boolean enable;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public String getJobName() {
-		return jobName;
-	}
-
-	public void setJobName(String jobName) {
-		this.jobName = jobName;
-	}
-
-	public String getJobGroup() {
-		return jobGroup;
-	}
-
-	public void setJobGroup(String jobGroup) {
-		this.jobGroup = jobGroup;
-	}
-
-	public String getCronExpression() {
-		return cronExpression;
-	}
-
-	public void setCronExpression(String cronExpression) {
-		this.cronExpression = cronExpression;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getSpringBean() {
-		return springBean;
-	}
-
-	public void setSpringBean(String springBean) {
-		this.springBean = springBean;
-	}
-
-	public Boolean getStateful() {
-		return stateful;
-	}
-
-	public void setStateful(Boolean stateful) {
-		this.stateful = stateful;
-	}
-
-	public Boolean getEnable() {
-		return enable;
-	}
-
-	public void setEnable(Boolean enable) {
-		this.enable = enable;
-	}
-
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
+
+/**
+ * 任务配置
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@Entity
+@Table(name = "EC_T_SCHEDULE_JOB")
+public class ScheduleJobEntity extends JpaEntity {
+	private static final long serialVersionUID = -1638993747996917970L;
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	/**
+	 * 任务名称
+	 */
+	@Column(unique = true, nullable = false)
+	private String jobName;
+
+	/**
+	 * 任务分组
+	 */
+	@Column(unique = false, nullable = false)
+	private String jobGroup;
+
+	/**
+	 * cron表达式
+	 */
+	@NotNull
+	private String cronExpression;
+
+	/**
+	 * 描述
+	 */
+	private String description;
+
+	/**
+	 * Spring bean
+	 */
+	@NotNull
+	private String springBean;
+
+	/**
+	 * 是否顺序执行
+	 */
+	private Boolean stateful;
+
+	@NotNull
+	private Boolean enable;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getJobName() {
+		return jobName;
+	}
+
+	public void setJobName(String jobName) {
+		this.jobName = jobName;
+	}
+
+	public String getJobGroup() {
+		return jobGroup;
+	}
+
+	public void setJobGroup(String jobGroup) {
+		this.jobGroup = jobGroup;
+	}
+
+	public String getCronExpression() {
+		return cronExpression;
+	}
+
+	public void setCronExpression(String cronExpression) {
+		this.cronExpression = cronExpression;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getSpringBean() {
+		return springBean;
+	}
+
+	public void setSpringBean(String springBean) {
+		this.springBean = springBean;
+	}
+
+	public Boolean getStateful() {
+		return stateful;
+	}
+
+	public void setStateful(Boolean stateful) {
+		this.stateful = stateful;
+	}
+
+	public Boolean getEnable() {
+		return enable;
+	}
+
+	public void setEnable(Boolean enable) {
+		this.enable = enable;
+	}
+
 }

+ 104 - 104
examcloud-task-dao/src/main/java/cn/com/qmth/examcloud/task/dao/entity/TaskTraceEntity.java

@@ -1,105 +1,105 @@
-package cn.com.qmth.examcloud.task.dao.entity;
-
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.Table;
-
-import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
-
-/**
- * 任务执行记录
- *
- * @author WANGWEI
- * @date 2018年3月7日
- * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
- */
-@Entity
-@Table(name = "EC_T_TASK_TRACE", indexes = {
-		@Index(name = "IDX_TASK_TRACE_TRACEID", columnList = "traceId")})
-public class TaskTraceEntity extends JpaEntity {
-
-	private static final long serialVersionUID = -1638993747996917970L;
-
-	@Id
-	@GeneratedValue
-	private Long id;
-
-	@Column(unique = false, nullable = false)
-	private Long jobId;
-
-	@Column(nullable = false)
-	private String traceId;
-
-	/**
-	 * 任务当前状态
-	 */
-	private String jobStatus;
-
-	private Date startTime;
-
-	private Date endTime;
-
-	private String exception;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public Long getJobId() {
-		return jobId;
-	}
-
-	public void setJobId(Long jobId) {
-		this.jobId = jobId;
-	}
-
-	public String getTraceId() {
-		return traceId;
-	}
-
-	public void setTraceId(String traceId) {
-		this.traceId = traceId;
-	}
-
-	public String getJobStatus() {
-		return jobStatus;
-	}
-
-	public void setJobStatus(String jobStatus) {
-		this.jobStatus = jobStatus;
-	}
-
-	public Date getStartTime() {
-		return startTime;
-	}
-
-	public void setStartTime(Date startTime) {
-		this.startTime = startTime;
-	}
-
-	public Date getEndTime() {
-		return endTime;
-	}
-
-	public void setEndTime(Date endTime) {
-		this.endTime = endTime;
-	}
-
-	public String getException() {
-		return exception;
-	}
-
-	public void setException(String exception) {
-		this.exception = exception;
-	}
-
+package cn.com.qmth.examcloud.task.dao.entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Table;
+
+import cn.com.qmth.examcloud.commons.web.jpa.JpaEntity;
+
+/**
+ * 任务执行记录
+ *
+ * @author WANGWEI
+ * @date 2018年3月7日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@Entity
+@Table(name = "EC_T_TASK_TRACE", indexes = {
+		@Index(name = "IDX_TASK_TRACE_TRACEID", columnList = "traceId")})
+public class TaskTraceEntity extends JpaEntity {
+
+	private static final long serialVersionUID = -1638993747996917970L;
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	@Column(unique = false, nullable = false)
+	private Long jobId;
+
+	@Column(nullable = false)
+	private String traceId;
+
+	/**
+	 * 任务当前状态
+	 */
+	private String jobStatus;
+
+	private Date startTime;
+
+	private Date endTime;
+
+	private String exception;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getJobId() {
+		return jobId;
+	}
+
+	public void setJobId(Long jobId) {
+		this.jobId = jobId;
+	}
+
+	public String getTraceId() {
+		return traceId;
+	}
+
+	public void setTraceId(String traceId) {
+		this.traceId = traceId;
+	}
+
+	public String getJobStatus() {
+		return jobStatus;
+	}
+
+	public void setJobStatus(String jobStatus) {
+		this.jobStatus = jobStatus;
+	}
+
+	public Date getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(Date startTime) {
+		this.startTime = startTime;
+	}
+
+	public Date getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(Date endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getException() {
+		return exception;
+	}
+
+	public void setException(String exception) {
+		this.exception = exception;
+	}
+
 }

+ 21 - 21
examcloud-task-service/pom.xml

@@ -1,22 +1,22 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.task</groupId>
-		<artifactId>examcloud-task</artifactId>
-		<version>2.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-task-service</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.task</groupId>
-			<artifactId>examcloud-task-dao</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.core.oe</groupId>
-			<artifactId>examcloud-core-oe-api-client</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.task</groupId>
+		<artifactId>examcloud-task</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-task-service</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.task</groupId>
+			<artifactId>examcloud-task-dao</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.core.oe</groupId>
+			<artifactId>examcloud-core-oe-api-client</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
 </project>

+ 61 - 61
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/DefaultTaskTracker.java

@@ -1,61 +1,61 @@
-package cn.com.qmth.examcloud.task.service;
-
-import java.util.Date;
-
-import javax.transaction.Transactional;
-
-import org.quartz.JobExecutionContext;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-import cn.com.qmth.examcloud.task.base.TaskTracker;
-import cn.com.qmth.examcloud.task.dao.TaskTraceRepo;
-import cn.com.qmth.examcloud.task.dao.entity.TaskTraceEntity;
-
-/**
- * 类注释
- *
- * @author WANGWEI
- * @date 2018年7月25日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Component
-public class DefaultTaskTracker implements TaskTracker {
-
-	@Autowired
-	TaskTraceRepo taskTraceRepo;
-
-	@Transactional
-	@Override
-	public void start(JobExecutionContext context, ScheduleJob scheduleJob, String traceId) {
-		TaskTraceEntity entity = new TaskTraceEntity();
-		entity.setJobId(scheduleJob.getJobId());
-		entity.setStartTime(new Date());
-		entity.setTraceId(traceId);
-		entity.setJobStatus("启动");
-		taskTraceRepo.save(entity);
-	}
-
-	@Transactional
-	@Override
-	public void whenException(JobExecutionContext context, ScheduleJob scheduleJob, String traceId,
-			Exception e) {
-		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
-		entity.setJobStatus("异常");
-		entity.setEndTime(new Date());
-		entity.setException(e.getCause().getMessage());
-		taskTraceRepo.save(entity);
-	}
-
-	@Transactional
-	@Override
-	public void onEnd(JobExecutionContext context, ScheduleJob scheduleJob, String traceId) {
-		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
-		entity.setJobStatus("成功");
-		entity.setEndTime(new Date());
-		taskTraceRepo.save(entity);
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.service;
+
+import java.util.Date;
+
+import javax.transaction.Transactional;
+
+import org.quartz.JobExecutionContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.base.TaskTracker;
+import cn.com.qmth.examcloud.task.dao.TaskTraceRepo;
+import cn.com.qmth.examcloud.task.dao.entity.TaskTraceEntity;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年7月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Component
+public class DefaultTaskTracker implements TaskTracker {
+
+	@Autowired
+	TaskTraceRepo taskTraceRepo;
+
+	@Transactional
+	@Override
+	public void start(JobExecutionContext context, ScheduleJob scheduleJob, String traceId) {
+		TaskTraceEntity entity = new TaskTraceEntity();
+		entity.setJobId(scheduleJob.getJobId());
+		entity.setStartTime(new Date());
+		entity.setTraceId(traceId);
+		entity.setJobStatus("启动");
+		taskTraceRepo.save(entity);
+	}
+
+	@Transactional
+	@Override
+	public void whenException(JobExecutionContext context, ScheduleJob scheduleJob, String traceId,
+			Exception e) {
+		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
+		entity.setJobStatus("异常");
+		entity.setEndTime(new Date());
+		entity.setException(e.getCause().getMessage());
+		taskTraceRepo.save(entity);
+	}
+
+	@Transactional
+	@Override
+	public void onEnd(JobExecutionContext context, ScheduleJob scheduleJob, String traceId) {
+		TaskTraceEntity entity = taskTraceRepo.findByTraceId(traceId);
+		entity.setJobStatus("成功");
+		entity.setEndTime(new Date());
+		taskTraceRepo.save(entity);
+
+	}
+
+}

+ 38 - 38
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/OeCleanExamRecordTask.java

@@ -1,38 +1,38 @@
-package cn.com.qmth.examcloud.task.service.job;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.core.oe.api.CleanExamRecordService;
-import cn.com.qmth.examcloud.task.base.AbstractTask;
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-import cn.com.qmth.examcloud.task.base.TaskTracker;
-
-/**
- * 
- * @author chenken
- * @date 2018年7月11日 上午11:02:50
- * @company QMTH
- * @description 网考考试记录清理job
- */
-@Component("oeCleanExamRecordTask")
-public class OeCleanExamRecordTask extends AbstractTask {
-
-	@Autowired
-	TaskTracker TaskTracker;
-
-	@Autowired
-	@Qualifier("cleanExamRecordClient")
-	private CleanExamRecordService cleanExamRecordService;
-
-	@Override
-	public void run(ScheduleJob scheduleJob) {
-		cleanExamRecordService.cleanExamExpiredExamRecord();
-	}
-
-	@Override
-	public TaskTracker getTaskTracker() {
-		return TaskTracker;
-	}
-}
+package cn.com.qmth.examcloud.task.service.job;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.core.oe.api.CleanExamRecordService;
+import cn.com.qmth.examcloud.task.base.AbstractTask;
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.base.TaskTracker;
+
+/**
+ * 
+ * @author chenken
+ * @date 2018年7月11日 上午11:02:50
+ * @company QMTH
+ * @description 网考考试记录清理job
+ */
+@Component("oeCleanExamRecordTask")
+public class OeCleanExamRecordTask extends AbstractTask {
+
+	@Autowired
+	TaskTracker TaskTracker;
+
+	@Autowired
+	@Qualifier("cleanExamRecordClient")
+	private CleanExamRecordService cleanExamRecordService;
+
+	@Override
+	public void run(ScheduleJob scheduleJob) {
+		cleanExamRecordService.cleanExamExpiredExamRecord();
+	}
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+}

+ 2 - 0
examcloud-task-starter/.logs/interface/task.interface.log

@@ -0,0 +1,2 @@
+2018-07-25 15:30:00.123| INFO |  -  | [CALL-IN]. url=http://EXAMCLOUD-SERVICE-OE/api/core/oe/cleanExamRecord
+2018-07-25 15:30:00.123| INFO |  -  | [CALL-REQ]. request=null

+ 94 - 0
examcloud-task-starter/.logs/task/task.log

@@ -0,0 +1,94 @@
+2018-07-25 15:24:59.217| DEBUG | main -  | add a job. job detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:24:59.245| DEBUG | main -  | add a job successfully. job detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:00.012| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:00.114| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:00.242| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:10.005| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:10.068| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:10.136| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:20.003| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:20.062| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:20.131| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:30.003| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:30.447| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:30.518| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:40.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:40.063| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:40.124| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:50.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:50.051| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:25:50.114| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:00.003| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:00.047| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:00.107| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:10.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:10.065| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:10.136| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:20.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:20.022| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:20.090| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:30.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:30.056| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:30.126| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:40.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:40.057| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:40.121| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:50.000| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:50.032| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:26:50.096| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:00.003| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:00.051| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:00.126| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:10.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:10.060| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:10.123| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:20.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:20.051| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:20.092| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:30.000| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:30.021| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:30.083| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:40.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:40.040| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:40.111| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:50.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:50.053| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:27:50.113| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:00.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:00.046| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:00.104| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:10.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:10.031| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:10.176| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:20.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:20.065| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:20.134| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:30.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:30.057| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:30.114| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:40.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:40.058| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:40.119| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:50.000| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:50.045| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:28:50.096| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:00.003| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:00.054| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:00.122| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:10.000| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:10.020| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:10.084| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:20.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:20.031| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:20.090| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:30.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:30.052| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:30.133| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:40.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:40.056| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:40.126| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:50.001| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:50.023| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:29:50.079| DEBUG |  -  | [TASK OUT]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:30:00.002| DEBUG |  -  | distribute job. job detail :{"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}
+2018-07-25 15:30:00.048| DEBUG |  -  | [TASK IN]. detail: {"jobId":1,"jobName":"fuck","jobGroup":"you","cronExpression":"0/10 * * * * ?","springBean":"oeCleanExamRecordTask","stateful":true}

+ 97 - 97
examcloud-task-starter/pom.xml

@@ -1,98 +1,98 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>cn.com.qmth.examcloud.task</groupId>
-    <artifactId>examcloud-task</artifactId>
-    <version>2.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>examcloud-task-starter</artifactId>
-  
-  <dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.task</groupId>
-			<artifactId>examcloud-task-api-provider</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-		</dependency>
-  </dependencies>
-  
-	<!-- 打包成zip -->
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<configuration>
-					<archive>
-						<manifest>
-							<mainClass>cn.com.qmth.examcloud.task.starter.TaskApp</mainClass>
-							<addClasspath>true</addClasspath>
-							<classpathPrefix>./</classpathPrefix>
-						</manifest>
-						<manifestEntries>
-							<Class-Path>../config/</Class-Path>
-						</manifestEntries>
-					</archive>
-					<excludes>
-						<exclude>*.properties</exclude>
-						<exclude>*.xml </exclude>
-						<exclude>*.conf </exclude>
-					</excludes>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-assembly-plugin</artifactId>
-				<configuration>
-					<finalName>examcloud-task</finalName>
-					<descriptors>
-						<descriptor>assembly.xml</descriptor>
-					</descriptors>
-				</configuration>
-				<executions>
-					<execution>
-						<id>make-assembly</id>
-						<phase>install</phase>
-						<goals>
-							<goal>assembly</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-	<!-- 
-	打成jar包
-	<build>  
-		<finalName>examcloud-task</finalName>
-		<plugins>  
-		    <plugin>  
-		        <groupId>org.springframework.boot</groupId>  
-		        <artifactId>spring-boot-maven-plugin</artifactId>  
-		        <configuration>  
-                	<fork>true</fork>  
-                	<mainClass>cn.com.qmth.examcloud.task.starter.TaskApp</mainClass> 主类 包含main
-                	<layout>JAR</layout> -包类型(必须大写) JAR,WAR,ZIP,MODULE,NONE
-            	</configuration>
-            	<executions>
-					<execution>
-						<goals>
-							<goal>repackage</goal>
-						</goals>
-					</execution>
-				</executions>
-		    </plugin>  
-		    <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                </configuration>
-            </plugin>
-		</plugins>  
-	 </build>   -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>cn.com.qmth.examcloud.task</groupId>
+    <artifactId>examcloud-task</artifactId>
+    <version>2.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>examcloud-task-starter</artifactId>
+  
+  <dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.task</groupId>
+			<artifactId>examcloud-task-api-provider</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+		</dependency>
+  </dependencies>
+  
+	<!-- 打包成zip -->
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<configuration>
+					<archive>
+						<manifest>
+							<mainClass>cn.com.qmth.examcloud.task.starter.TaskApp</mainClass>
+							<addClasspath>true</addClasspath>
+							<classpathPrefix>./</classpathPrefix>
+						</manifest>
+						<manifestEntries>
+							<Class-Path>../config/</Class-Path>
+						</manifestEntries>
+					</archive>
+					<excludes>
+						<exclude>*.properties</exclude>
+						<exclude>*.xml </exclude>
+						<exclude>*.conf </exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<configuration>
+					<finalName>examcloud-task</finalName>
+					<descriptors>
+						<descriptor>assembly.xml</descriptor>
+					</descriptors>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>install</phase>
+						<goals>
+							<goal>assembly</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<!-- 
+	打成jar包
+	<build>  
+		<finalName>examcloud-task</finalName>
+		<plugins>  
+		    <plugin>  
+		        <groupId>org.springframework.boot</groupId>  
+		        <artifactId>spring-boot-maven-plugin</artifactId>  
+		        <configuration>  
+                	<fork>true</fork>  
+                	<mainClass>cn.com.qmth.examcloud.task.starter.TaskApp</mainClass> 主类 包含main
+                	<layout>JAR</layout> -包类型(必须大写) JAR,WAR,ZIP,MODULE,NONE
+            	</configuration>
+            	<executions>
+					<execution>
+						<goals>
+							<goal>repackage</goal>
+						</goals>
+					</execution>
+				</executions>
+		    </plugin>  
+		    <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+		</plugins>  
+	 </build>   -->
 </project>

+ 91 - 91
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/TaskApp.java

@@ -1,91 +1,91 @@
-package cn.com.qmth.examcloud.task.starter;
-
-import org.slf4j.MDC;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.cloud.client.loadbalancer.LoadBalanced;
-import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
-import org.springframework.context.annotation.Bean;
-import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-import org.springframework.web.client.RestTemplate;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.base.logging.SLF4JImpl;
-import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
-import cn.com.qmth.examcloud.commons.web.redis.RedisClientImpl;
-import cn.com.qmth.examcloud.commons.web.support.CustomResponseErrorHandler;
-import cn.com.qmth.examcloud.task.starter.config.JobsInitializationListener;
-
-@SpringBootApplication(scanBasePackages = {"cn.com.qmth"})
-@EnableJpaRepositories(basePackages = {"cn.com.qmth"})
-@EntityScan(basePackages = {"cn.com.qmth"})
-@EnableJpaAuditing
-@EnableEurekaClient
-@EnableScheduling
-@EnableAutoConfiguration
-public class TaskApp {
-
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(TaskApp.class);
-
-	public static void main(String[] args) throws Exception {
-		if (LOG instanceof SLF4JImpl) {
-			MDC.put("TRACE_ID", Thread.currentThread().getName());
-		}
-
-		SpringApplication application = new SpringApplication(TaskApp.class);
-		application.addListeners(new JobsInitializationListener());
-		application.run(args);
-	}
-
-	@Bean
-	@LoadBalanced
-	public RestTemplate restTemplate() {
-		RestTemplate restTemplate = new RestTemplate();
-		restTemplate.setErrorHandler(new CustomResponseErrorHandler());
-		return restTemplate;
-	}
-
-	@Bean
-	public RedisTemplate<String, Object> redisTemplate(
-			RedisConnectionFactory redisConnectionFactory) {
-		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
-		redisTemplate.setConnectionFactory(redisConnectionFactory);
-		Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(
-				Object.class);
-		ObjectMapper objectMapper = new ObjectMapper();
-		objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-		objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-		jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
-		redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
-		redisTemplate.setKeySerializer(new StringRedisSerializer());
-		redisTemplate.afterPropertiesSet();
-		return redisTemplate;
-	}
-
-	@Bean
-	@Autowired
-	public RedisClient redisClient(RedisTemplate<String, Object> redisTemplate) {
-		return new RedisClientImpl(redisTemplate);
-	}
-
-	@Bean(name = "schedulerFactoryBean")
-	public SchedulerFactoryBean schedulerFactory() {
-		return new SchedulerFactoryBean();
-	}
-
-}
+package cn.com.qmth.examcloud.task.starter;
+
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.base.logging.SLF4JImpl;
+import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
+import cn.com.qmth.examcloud.commons.web.redis.RedisClientImpl;
+import cn.com.qmth.examcloud.commons.web.support.CustomResponseErrorHandler;
+import cn.com.qmth.examcloud.task.starter.config.JobsInitializationListener;
+
+@SpringBootApplication(scanBasePackages = {"cn.com.qmth"})
+@EnableJpaRepositories(basePackages = {"cn.com.qmth"})
+@EntityScan(basePackages = {"cn.com.qmth"})
+@EnableJpaAuditing
+@EnableEurekaClient
+@EnableScheduling
+@EnableAutoConfiguration
+public class TaskApp {
+
+	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(TaskApp.class);
+
+	public static void main(String[] args) throws Exception {
+		if (LOG instanceof SLF4JImpl) {
+			MDC.put("TRACE_ID", Thread.currentThread().getName());
+		}
+
+		SpringApplication application = new SpringApplication(TaskApp.class);
+		application.addListeners(new JobsInitializationListener());
+		application.run(args);
+	}
+
+	@Bean
+	@LoadBalanced
+	public RestTemplate restTemplate() {
+		RestTemplate restTemplate = new RestTemplate();
+		restTemplate.setErrorHandler(new CustomResponseErrorHandler());
+		return restTemplate;
+	}
+
+	@Bean
+	public RedisTemplate<String, Object> redisTemplate(
+			RedisConnectionFactory redisConnectionFactory) {
+		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+		redisTemplate.setConnectionFactory(redisConnectionFactory);
+		Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(
+				Object.class);
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+		objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+		jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+		redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+		redisTemplate.setKeySerializer(new StringRedisSerializer());
+		redisTemplate.afterPropertiesSet();
+		return redisTemplate;
+	}
+
+	@Bean
+	@Autowired
+	public RedisClient redisClient(RedisTemplate<String, Object> redisTemplate) {
+		return new RedisClientImpl(redisTemplate);
+	}
+
+	@Bean(name = "schedulerFactoryBean")
+	public SchedulerFactoryBean schedulerFactory() {
+		return new SchedulerFactoryBean();
+	}
+
+}

+ 83 - 83
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/DefaultWebMvcConfigurerAdapter.java

@@ -1,83 +1,83 @@
-package cn.com.qmth.examcloud.task.starter.config;
-
-import java.util.List;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-
-import cn.com.qmth.examcloud.commons.base.util.PathUtil;
-import cn.com.qmth.examcloud.commons.base.util.PropertiesUtil;
-import cn.com.qmth.examcloud.commons.web.interceptor.FirstInterceptor;
-import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
-import cn.com.qmth.examcloud.commons.web.security.RequestPermissionInterceptor;
-import cn.com.qmth.examcloud.commons.web.security.SpringCloudInterceptor;
-import cn.com.qmth.examcloud.commons.web.security.bean.Role;
-import cn.com.qmth.examcloud.commons.web.security.bean.User;
-
-/**
- * 默认WebMvcConfigurer
- *
- * @author WANGWEI
- * @date 2018年5月22日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-@Configuration
-public class DefaultWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
-
-	@Autowired
-	RedisClient redisClient;
-
-	static {
-		PropertiesUtil.configureAndWatch(PathUtil.getResoucePath("security-mapping.properties"));
-	}
-
-	@Override
-	public void addInterceptors(InterceptorRegistry registry) {
-		registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
-
-		SpringCloudInterceptor springCloudInterceptor = new SpringCloudInterceptor();
-		springCloudInterceptor.setRedisClient(redisClient);
-		registry.addInterceptor(springCloudInterceptor).addPathPatterns("/**");
-
-		RequestPermissionInterceptor requestPermissionInterceptor = getRequestPermissionInterceptor();
-		requestPermissionInterceptor.configureAndWatch("security-exclusions.conf");
-		registry.addInterceptor(requestPermissionInterceptor).addPathPatterns("/**");
-
-		super.addInterceptors(registry);
-	}
-
-	@Bean
-	public RequestPermissionInterceptor getRequestPermissionInterceptor() {
-		return new RequestPermissionInterceptor(redisClient) {
-
-			@Override
-			public boolean hasPermission(String mappingPath, User user) {
-				List<Role> roleList = user.getRoleList();
-				if (CollectionUtils.isEmpty(roleList)) {
-					return false;
-				}
-
-				String roles = PropertiesUtil.getString(mappingPath);
-				if (StringUtils.isBlank(roles)) {
-					return true;
-				}
-
-				roles = "," + roles + ",";
-
-				for (Role role : roleList) {
-					if (roles.contains("," + role.getRoleCode() + ",")) {
-						return true;
-					}
-				}
-
-				return false;
-			}
-
-		};
-	}
-}
+package cn.com.qmth.examcloud.task.starter.config;
+
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import cn.com.qmth.examcloud.commons.base.util.PathUtil;
+import cn.com.qmth.examcloud.commons.base.util.PropertiesUtil;
+import cn.com.qmth.examcloud.commons.web.interceptor.FirstInterceptor;
+import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
+import cn.com.qmth.examcloud.commons.web.security.RequestPermissionInterceptor;
+import cn.com.qmth.examcloud.commons.web.security.SpringCloudInterceptor;
+import cn.com.qmth.examcloud.commons.web.security.bean.Role;
+import cn.com.qmth.examcloud.commons.web.security.bean.User;
+
+/**
+ * 默认WebMvcConfigurer
+ *
+ * @author WANGWEI
+ * @date 2018年5月22日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Configuration
+public class DefaultWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
+
+	@Autowired
+	RedisClient redisClient;
+
+	static {
+		PropertiesUtil.configureAndWatch(PathUtil.getResoucePath("security-mapping.properties"));
+	}
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
+
+		SpringCloudInterceptor springCloudInterceptor = new SpringCloudInterceptor();
+		springCloudInterceptor.setRedisClient(redisClient);
+		registry.addInterceptor(springCloudInterceptor).addPathPatterns("/**");
+
+		RequestPermissionInterceptor requestPermissionInterceptor = getRequestPermissionInterceptor();
+		requestPermissionInterceptor.configureAndWatch("security-exclusions.conf");
+		registry.addInterceptor(requestPermissionInterceptor).addPathPatterns("/**");
+
+		super.addInterceptors(registry);
+	}
+
+	@Bean
+	public RequestPermissionInterceptor getRequestPermissionInterceptor() {
+		return new RequestPermissionInterceptor(redisClient) {
+
+			@Override
+			public boolean hasPermission(String mappingPath, User user) {
+				List<Role> roleList = user.getRoleList();
+				if (CollectionUtils.isEmpty(roleList)) {
+					return false;
+				}
+
+				String roles = PropertiesUtil.getString(mappingPath);
+				if (StringUtils.isBlank(roles)) {
+					return true;
+				}
+
+				roles = "," + roles + ",";
+
+				for (Role role : roleList) {
+					if (roles.contains("," + role.getRoleCode() + ",")) {
+						return true;
+					}
+				}
+
+				return false;
+			}
+
+		};
+	}
+}

+ 41 - 41
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/JobsInitialization.java

@@ -1,41 +1,41 @@
-package cn.com.qmth.examcloud.task.starter.config;
-
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.task.base.QuartzManager;
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-import cn.com.qmth.examcloud.task.dao.ScheduleJobRepo;
-import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
-
-@Component
-public class JobsInitialization {
-
-	@Autowired
-	private ScheduleJobRepo scheduleJobEntityRepo;
-
-	@Autowired
-	private QuartzManager quartzManager;
-
-	public void init() {
-		List<ScheduleJobEntity> jobEntityList = scheduleJobEntityRepo.findAll();
-
-		for (ScheduleJobEntity jobEntity : jobEntityList) {
-			if (!jobEntity.getEnable()) {
-				continue;
-			}
-			ScheduleJob scheduleJob = new ScheduleJob();
-			scheduleJob.setJobId(jobEntity.getId());
-			scheduleJob.setJobName(jobEntity.getJobName());
-			scheduleJob.setJobGroup(jobEntity.getJobGroup());
-			scheduleJob.setSpringBean(jobEntity.getSpringBean());
-			scheduleJob.setCronExpression(jobEntity.getCronExpression());
-			scheduleJob.setStateful(jobEntity.getStateful());
-			quartzManager.addJob(scheduleJob);
-		}
-
-	}
-
-}
+package cn.com.qmth.examcloud.task.starter.config;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.task.base.QuartzManager;
+import cn.com.qmth.examcloud.task.base.ScheduleJob;
+import cn.com.qmth.examcloud.task.dao.ScheduleJobRepo;
+import cn.com.qmth.examcloud.task.dao.entity.ScheduleJobEntity;
+
+@Component
+public class JobsInitialization {
+
+	@Autowired
+	private ScheduleJobRepo scheduleJobEntityRepo;
+
+	@Autowired
+	private QuartzManager quartzManager;
+
+	public void init() {
+		List<ScheduleJobEntity> jobEntityList = scheduleJobEntityRepo.findAll();
+
+		for (ScheduleJobEntity jobEntity : jobEntityList) {
+			if (!jobEntity.getEnable()) {
+				continue;
+			}
+			ScheduleJob scheduleJob = new ScheduleJob();
+			scheduleJob.setJobId(jobEntity.getId());
+			scheduleJob.setJobName(jobEntity.getJobName());
+			scheduleJob.setJobGroup(jobEntity.getJobGroup());
+			scheduleJob.setSpringBean(jobEntity.getSpringBean());
+			scheduleJob.setCronExpression(jobEntity.getCronExpression());
+			scheduleJob.setStateful(jobEntity.getStateful());
+			quartzManager.addJob(scheduleJob);
+		}
+
+	}
+
+}

+ 23 - 23
examcloud-task-starter/src/main/java/cn/com/qmth/examcloud/task/starter/config/JobsInitializationListener.java

@@ -1,23 +1,23 @@
-package cn.com.qmth.examcloud.task.starter.config;
-
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.event.ContextRefreshedEvent;
-
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.task.starter.TaskApp;
-
-public class JobsInitializationListener implements ApplicationListener<ContextRefreshedEvent> {
-
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(TaskApp.class);
-
-	@Override
-	public void onApplicationEvent(ContextRefreshedEvent event) {
-		LOG.info("start to init jobs...");
-		JobsInitialization jobsInitialization = event.getApplicationContext()
-				.getBean(JobsInitialization.class);
-		jobsInitialization.init();
-		LOG.info ("jobs inited.");
-	}
-
-}
+package cn.com.qmth.examcloud.task.starter.config;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.task.starter.TaskApp;
+
+public class JobsInitializationListener implements ApplicationListener<ContextRefreshedEvent> {
+
+	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(TaskApp.class);
+
+	@Override
+	public void onApplicationEvent(ContextRefreshedEvent event) {
+		LOG.info("start to init jobs...");
+		JobsInitialization jobsInitialization = event.getApplicationContext()
+				.getBean(JobsInitialization.class);
+		jobsInitialization.init();
+		LOG.info ("jobs inited.");
+	}
+
+}

+ 7 - 7
examcloud-task-starter/src/main/resources/application-dev.properties

@@ -1,8 +1,8 @@
-spring.datasource.url=jdbc:mysql://db-host:3306/exam_cloud_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
-spring.datasource.username=root
-spring.datasource.password=root
-
-spring.redis.host=192.168.10.30
-spring.redis.port=6379
-
+spring.datasource.url=jdbc:mysql://db-host:3306/exam_cloud_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
+spring.datasource.username=root
+spring.datasource.password=root
+
+spring.redis.host=192.168.10.30
+spring.redis.port=6379
+
 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

+ 27 - 27
examcloud-task-starter/src/main/resources/application.properties

@@ -1,27 +1,27 @@
-spring.profiles.active=dev
-spring.application.name=EXAMCLOUD-TASK
-server.port=8011
-
-$rmp.ctr.task=/api/ctr/task/
-$rmp.cloud.task=/api/cloud/task/
-
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-spring.datasource.test-on-borrow=true
-
-spring.http.multipart.max-file-size=50Mb
-spring.http.multipart.max-request-size=50Mb
-
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-spring.jpa.show-sql=true
-spring.jpa.hibernate.ddl-auto=update
-app.oe.examcontrol.session.expire=30
-app.oe.examcontrol.session.captureCycle=300
-
-hystrix.command.default.execution.timeout.enabled=false
-hystrix.threadpool.default.coreSize = 500
-
-feign.httpclient.enabled=false
-feign.okhttp.enabled=true
-
+spring.profiles.active=dev
+spring.application.name=EXAMCLOUD-TASK
+server.port=8011
+
+$rmp.ctr.task=/api/ctr/task/
+$rmp.cloud.task=/api/cloud/task/
+
+spring.datasource.validation-query=SELECT 1 FROM DUAL
+spring.datasource.test-on-borrow=true
+
+spring.http.multipart.max-file-size=50Mb
+spring.http.multipart.max-request-size=50Mb
+
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+app.oe.examcontrol.session.expire=30
+app.oe.examcontrol.session.captureCycle=300
+
+hystrix.command.default.execution.timeout.enabled=false
+hystrix.threadpool.default.coreSize = 500
+
+feign.httpclient.enabled=false
+feign.okhttp.enabled=true
+

+ 77 - 77
examcloud-task-starter/src/main/resources/logback-spring.xml

@@ -1,78 +1,78 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration debug="true" scan="true" scanPeriod="30 seconds">
-
-	<springProperty scope="context" name="logdir" source="logback.logdir" />
-
-	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m | [%class:%line]%n</pattern>
-		</encoder>
-	</appender>
-
-	<!-- debug 日志 -->
-	<appender name="DEBUG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>./logs/debug/task.debug.log</file>
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m | [%class:%line]%n</pattern>
-		</encoder>
-		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-			<fileNamePattern>./logs/debug/task.debug.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
-			<maxHistory>100</maxHistory>
-			<maxFileSize>100MB</maxFileSize>
-		</rollingPolicy>
-	</appender>
-
-	<!-- 接口日志 -->
-	<appender name="INTERFACE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>.logs/interface/task.interface.log</file>
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m%n</pattern>
-		</encoder>
-		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-			<fileNamePattern>.logs/interface/task.interface.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
-			<maxHistory>100</maxHistory>
-			<maxFileSize>100MB</maxFileSize>
-		</rollingPolicy>
-	</appender>
-
-	<!-- 任务日志 -->
-	<appender name="TASK_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>.logs/task/task.log</file>
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m%n</pattern>
-		</encoder>
-		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-			<fileNamePattern>.logs/task/task.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
-			<maxHistory>100</maxHistory>
-			<maxFileSize>100MB</maxFileSize>
-		</rollingPolicy>
-	</appender>
-
-	<logger name="cn.com.qmth.examcloud" level="DEBUG" additivity="false">
-		<appender-ref ref="DEBUG_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</logger>
-
-	<logger name="INTERFACE_LOGGER" level="DEBUG" additivity="false">
-		<appender-ref ref="INTERFACE_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</logger>
-
-	<logger name="TASK_LOGGER" level="DEBUG" additivity="false">
-		<appender-ref ref="TASK_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</logger>
-
-	<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
-	<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
-	<logger name="org.hibernate.SQL" level="DEBUG" />
-	<logger name="org.hibernate.type" level="DEBUG" />
-	<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
-	<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-
-	<root level="INFO">
-		<appender-ref ref="DEBUG_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</root>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="true" scan="true" scanPeriod="30 seconds">
+
+	<springProperty scope="context" name="logdir" source="logback.logdir" />
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m | [%class:%line]%n</pattern>
+		</encoder>
+	</appender>
+
+	<!-- debug 日志 -->
+	<appender name="DEBUG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>./logs/debug/task.debug.log</file>
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m | [%class:%line]%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<fileNamePattern>./logs/debug/task.debug.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
+			<maxHistory>100</maxHistory>
+			<maxFileSize>100MB</maxFileSize>
+		</rollingPolicy>
+	</appender>
+
+	<!-- 接口日志 -->
+	<appender name="INTERFACE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>.logs/interface/task.interface.log</file>
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<fileNamePattern>.logs/interface/task.interface.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
+			<maxHistory>100</maxHistory>
+			<maxFileSize>100MB</maxFileSize>
+		</rollingPolicy>
+	</appender>
+
+	<!-- 任务日志 -->
+	<appender name="TASK_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>.logs/task/task.log</file>
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<fileNamePattern>.logs/task/task.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
+			<maxHistory>100</maxHistory>
+			<maxFileSize>100MB</maxFileSize>
+		</rollingPolicy>
+	</appender>
+
+	<logger name="cn.com.qmth.examcloud" level="DEBUG" additivity="false">
+		<appender-ref ref="DEBUG_APPENDER" />
+		<appender-ref ref="STDOUT" />
+	</logger>
+
+	<logger name="INTERFACE_LOGGER" level="DEBUG" additivity="false">
+		<appender-ref ref="INTERFACE_APPENDER" />
+		<appender-ref ref="STDOUT" />
+	</logger>
+
+	<logger name="TASK_LOGGER" level="DEBUG" additivity="false">
+		<appender-ref ref="TASK_APPENDER" />
+		<appender-ref ref="STDOUT" />
+	</logger>
+
+	<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
+	<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
+	<logger name="org.hibernate.SQL" level="DEBUG" />
+	<logger name="org.hibernate.type" level="DEBUG" />
+	<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
+	<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
+
+	<root level="INFO">
+		<appender-ref ref="DEBUG_APPENDER" />
+		<appender-ref ref="STDOUT" />
+	</root>
+
 </configuration>

+ 3 - 3
examcloud-task-starter/src/main/resources/security-exclusions.conf

@@ -1,3 +1,3 @@
-
-
-
+
+
+

+ 1 - 1
examcloud-task-starter/src/main/resources/security-mapping.properties

@@ -1 +1 @@
-
+

+ 0 - 31
examcloud-task-starter/src/test/java/cn/com/qmth/task/TestTaskSchedule.java

@@ -1,31 +0,0 @@
-package cn.com.qmth.task;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import cn.com.qmth.examcloud.task.base.QuartzManager;
-import cn.com.qmth.examcloud.task.base.ScheduleJob;
-
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes={cn.com.qmth.examcloud.task.starter.TaskApp.class})
-public class TestTaskSchedule {
-
-	@Autowired
-	private QuartzManager quartzManager;
-	
-	@Test
-	public void executeTaskTest(){
-		ScheduleJob scheduleJob = new ScheduleJob();
-		scheduleJob.setJobName("clean exam");
-		scheduleJob.setJobGroup("OE");
-		scheduleJob.setSpringBean("oeCleanExamRecordTask");
-		scheduleJob.setCronExpression("0/10 * * * * ?");
-		scheduleJob.setStateful(true);
-		quartzManager.addJob(scheduleJob);
-	}
-	
-}