|
@@ -3,17 +3,22 @@ package com.shkpr.service.alambizplugin.bizservice;
|
|
|
import com.global.base.log.LogLevelFlag;
|
|
|
import com.global.base.log.LogPrintMgr;
|
|
|
import com.shkpr.service.alambizplugin.apiparam.GisSurveyCheckParams;
|
|
|
+import com.shkpr.service.alambizplugin.commproperties.GisSurveySystemCheckProperties;
|
|
|
+import com.shkpr.service.alambizplugin.components.GisSurveySystemCheckResultManager;
|
|
|
import com.shkpr.service.alambizplugin.components.GisSurveySystemChecker;
|
|
|
+import com.shkpr.service.alambizplugin.constants.GisSurveyCheckStatusEnum;
|
|
|
import com.shkpr.service.alambizplugin.constants.GisSurveyCheckTypeEnum;
|
|
|
import com.shkpr.service.alambizplugin.constants.LogFlagBusiType;
|
|
|
-import com.shkpr.service.alambizplugin.dto.GisSurveyCheckResult;
|
|
|
-import com.shkpr.service.alambizplugin.dto.GisSurveyCheckTaskId;
|
|
|
+import com.shkpr.service.alambizplugin.dbdao.services.intef.GisSurveyJobInfoService;
|
|
|
+import com.shkpr.service.alambizplugin.dbdao.services.intef.GisSurveyProjectInfoService;
|
|
|
+import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckId;
|
|
|
+import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckResult;
|
|
|
+import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckSubtask;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.concurrent.ListenableFuture;
|
|
|
|
|
|
import java.time.Duration;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
@@ -32,23 +37,37 @@ public class GisSurveyBizService {
|
|
|
/**
|
|
|
* 任务缓存
|
|
|
*/
|
|
|
- private final static Map<GisSurveyCheckTaskId, ListenableFuture<GisSurveyCheckResult>> FUTURE_CACHE = new ConcurrentHashMap<>();
|
|
|
+ private final static Map<GisSurveySystemCheckId, ListenableFuture<GisSurveySystemCheckResult>> TASK_CACHE = new ConcurrentHashMap<>();
|
|
|
+ /**
|
|
|
+ * 子任务缓存
|
|
|
+ */
|
|
|
+ private final static Map<GisSurveySystemCheckId, GisSurveySystemCheckSubtask> SUBTASK_CACHE = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
/**
|
|
|
* 开始时间缓存
|
|
|
*/
|
|
|
- private final static Map<GisSurveyCheckTaskId, LocalDateTime> TIME_CACHE = new ConcurrentHashMap<>();
|
|
|
+ private final static Map<GisSurveySystemCheckId, LocalDateTime> TIME_CACHE = new ConcurrentHashMap<>();
|
|
|
/**
|
|
|
* log
|
|
|
*/
|
|
|
private final String mStrClassName;
|
|
|
private final String mBizType;
|
|
|
|
|
|
+ private final GisSurveySystemCheckProperties systemCheckProperties;
|
|
|
+ private final GisSurveySystemCheckResultManager systemCheckFileManager;
|
|
|
private final GisSurveySystemChecker systemChecker;
|
|
|
+ private final GisSurveyProjectInfoService projectInfoService;
|
|
|
+ private final GisSurveyJobInfoService jobInfoService;
|
|
|
|
|
|
- public GisSurveyBizService(GisSurveySystemChecker systemChecker) {
|
|
|
+ public GisSurveyBizService(GisSurveySystemCheckProperties systemCheckProperties, GisSurveySystemCheckResultManager systemCheckFileManager
|
|
|
+ , GisSurveySystemChecker systemChecker, GisSurveyProjectInfoService projectInfoService, GisSurveyJobInfoService jobInfoService) {
|
|
|
mStrClassName = "GisSurveyBizService";
|
|
|
mBizType = LogFlagBusiType.BUSI_GIS_SURVEY.toStrValue();
|
|
|
+ this.systemCheckProperties = systemCheckProperties;
|
|
|
+ this.systemCheckFileManager = systemCheckFileManager;
|
|
|
this.systemChecker = systemChecker;
|
|
|
+ this.projectInfoService = projectInfoService;
|
|
|
+ this.jobInfoService = jobInfoService;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -57,100 +76,107 @@ public class GisSurveyBizService {
|
|
|
* @param params 系统检查参数
|
|
|
* @return 检查状态
|
|
|
*/
|
|
|
- public GisSurveyCheckResult sysCheckFun(GisSurveyCheckParams params) {
|
|
|
- //任务标识
|
|
|
- GisSurveyCheckTaskId taskId = generateTaskId(params);
|
|
|
- if (taskId == null) return GisSurveyCheckResult.notExists(params);
|
|
|
+ public GisSurveySystemCheckResult sysCheckFun(GisSurveyCheckParams params) {
|
|
|
+ //系统检查id
|
|
|
+ GisSurveySystemCheckId systemCheckId = GisSurveySystemCheckId.generateId(params);
|
|
|
+ if (systemCheckId == null) return GisSurveySystemCheckResult.notExists(params);
|
|
|
//获取已存在的任务
|
|
|
- ListenableFuture<GisSurveyCheckResult> previousFuture = FUTURE_CACHE.get(taskId);
|
|
|
- //进行中判断(未完成且未清除)
|
|
|
- if (previousFuture != null && !previousFuture.isDone() && !previousFuture.isCancelled())
|
|
|
- return GisSurveyCheckResult.inProgress(params, TIME_CACHE.get(taskId));
|
|
|
- //已结束判断,删除缓存
|
|
|
- if (previousFuture != null && (previousFuture.isDone() || previousFuture.isCancelled()))
|
|
|
- FUTURE_CACHE.remove(taskId);
|
|
|
- //启动检查任务
|
|
|
- startTask(taskId, params);
|
|
|
- //返回进行中
|
|
|
- return GisSurveyCheckResult.inProgress(params, LocalDateTime.now());
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取结果
|
|
|
- *
|
|
|
- * @param params 系统检查参数
|
|
|
- * @return 检查结果(可能进行中)
|
|
|
- */
|
|
|
- public GisSurveyCheckResult getResult(GisSurveyCheckParams params) {
|
|
|
- //任务标识
|
|
|
- GisSurveyCheckTaskId taskId = generateTaskId(params);
|
|
|
- if (taskId == null) return GisSurveyCheckResult.notExists(params);
|
|
|
- //获取任务
|
|
|
- ListenableFuture<GisSurveyCheckResult> checkFuture = FUTURE_CACHE.get(taskId);
|
|
|
- if (checkFuture == null) return GisSurveyCheckResult.notExists(params);
|
|
|
- //已结束,则直接返回失败(如完成cancelled为false,切无法clear)
|
|
|
- if (checkFuture.isCancelled()) return GisSurveyCheckResult.fail(params);
|
|
|
- //完成判断,如完成直接返回结果
|
|
|
- if (checkFuture.isDone()) {
|
|
|
+ ListenableFuture<GisSurveySystemCheckResult> previousFuture = TASK_CACHE.get(systemCheckId);
|
|
|
+ //如任务已完成,则检查历史失败
|
|
|
+ if (!params.getIgnoreFail() && previousFuture != null && previousFuture.isDone()) {
|
|
|
try {
|
|
|
- return FUTURE_CACHE.get(taskId).get();
|
|
|
- } catch (ExecutionException | InterruptedException e) {
|
|
|
- //打印报错信息(不太可能走到这里)
|
|
|
+ //获取结果,并检查失败
|
|
|
+ GisSurveySystemCheckResult gisSurveySystemCheckResult = previousFuture.get();
|
|
|
+ if (Objects.equals(gisSurveySystemCheckResult.getCheckStatus(), GisSurveyCheckStatusEnum.FAIL.getCode()))
|
|
|
+ return gisSurveySystemCheckResult;
|
|
|
+ } catch (InterruptedException | ExecutionException e) {
|
|
|
+ //打印报错信息(不太可能走到这)
|
|
|
LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
|
|
|
- , String.format(
|
|
|
- "监测到中断或执行异常 param:%s msg:%s"
|
|
|
- , params
|
|
|
- , e.getMessage()
|
|
|
- )
|
|
|
+ , String.format("检查历史失败异常 系统检查id:%s msg:%s", systemCheckId, e.getMessage())
|
|
|
);
|
|
|
- return GisSurveyCheckResult.fail(params);
|
|
|
}
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取已存在的结果
|
|
|
+ GisSurveySystemCheckResult result = systemCheckFileManager.getResult(systemCheckId);
|
|
|
+ //获取元素更新时间
|
|
|
+ LocalDateTime refreshTime = getRefreshTimeDuration(systemCheckId);
|
|
|
+ //回填元素更新时间
|
|
|
+ params.setRefreshTime(refreshTime);
|
|
|
+ //判断结果是否存在
|
|
|
+ if (result != null) {
|
|
|
+ //判断时间间隔,如滞后未到临界,则直接返回结果
|
|
|
+ if (result.getRefreshTime() != null && refreshTime != null) {
|
|
|
+ //结果滞后数据库的时间
|
|
|
+ Duration lags = Duration.between(result.getRefreshTime(), refreshTime);
|
|
|
+ //规定滞后时间大于真实滞后时间,直接返回结果
|
|
|
+ if (systemCheckProperties.getResultLagDuration().compareTo(lags) >= 0) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //系统检查子任务
|
|
|
+ GisSurveySystemCheckSubtask checkSubtask = SUBTASK_CACHE.get(systemCheckId);
|
|
|
+ //进行中判断(未完成且未清除)
|
|
|
+ if (previousFuture != null && !previousFuture.isDone() && !previousFuture.isCancelled())
|
|
|
+ return GisSurveySystemCheckResult.inProgress(params, checkSubtask, TIME_CACHE.get(systemCheckId));
|
|
|
+ //启动检查任务
|
|
|
+ if (Boolean.TRUE.equals(params.getCheckStart())) {
|
|
|
+ startTask(systemCheckId, params);
|
|
|
+ //如需要返回上次结果,则直接返回结果
|
|
|
+ if (Boolean.TRUE.equals(params.getReturnLastResult())) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //返回进行中
|
|
|
+ return GisSurveySystemCheckResult.inProgress(params, checkSubtask, LocalDateTime.now());
|
|
|
}
|
|
|
- //返回进行中
|
|
|
- return GisSurveyCheckResult.inProgress(params, TIME_CACHE.get(taskId));
|
|
|
+ //未启动返回结果
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 删除结果
|
|
|
+ * 取消检查
|
|
|
*
|
|
|
* @param params 系统检查参数
|
|
|
* @return 检查结果(可能进行中)
|
|
|
*/
|
|
|
- public GisSurveyCheckResult delResult(GisSurveyCheckParams params) {
|
|
|
+ public GisSurveySystemCheckResult cancelCheck(GisSurveyCheckParams params) {
|
|
|
//任务标识
|
|
|
- GisSurveyCheckTaskId taskId = generateTaskId(params);
|
|
|
- if (taskId == null) return GisSurveyCheckResult.fail(params);
|
|
|
+ GisSurveySystemCheckId taskId = GisSurveySystemCheckId.generateId(params);
|
|
|
+ if (taskId == null) return GisSurveySystemCheckResult.fail(params);
|
|
|
//如无缓存,则直接返回不存在
|
|
|
- if (!FUTURE_CACHE.containsKey(taskId)) return GisSurveyCheckResult.notExists(params);
|
|
|
+ if (!TASK_CACHE.containsKey(taskId)) return GisSurveySystemCheckResult.notExists(params);
|
|
|
//关闭检查任务
|
|
|
- return stopTask(taskId) ? GisSurveyCheckResult.success(params) : GisSurveyCheckResult.fail(params);
|
|
|
+ return stopTask(taskId) ? GisSurveySystemCheckResult.success(params) : GisSurveySystemCheckResult.fail(params);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 过期任务
|
|
|
* <p>用于检查和使任务过期</p>
|
|
|
- *
|
|
|
- * @param ttl 超时时间(分钟)
|
|
|
*/
|
|
|
- public void expireResult(long ttl) {
|
|
|
+ public void expireResult(Duration ttl) {
|
|
|
//获取超时的id
|
|
|
- List<GisSurveyCheckTaskId> taskIds = TIME_CACHE.entrySet().stream()
|
|
|
- .filter(entry -> Duration.between(entry.getValue(), LocalDateTime.now()).toMinutes() > ttl)
|
|
|
+ List<GisSurveySystemCheckId> systemCheckIds = TIME_CACHE.entrySet().stream()
|
|
|
+ .filter(entry ->
|
|
|
+ Duration.between(entry.getValue(), LocalDateTime.now()).compareTo(ttl) > 0
|
|
|
+ )
|
|
|
.map(Map.Entry::getKey)
|
|
|
.collect(Collectors.toList());
|
|
|
//停止超时的任务并删除任务缓存
|
|
|
- for (GisSurveyCheckTaskId taskId : taskIds) {
|
|
|
+ for (GisSurveySystemCheckId systemCheckId : systemCheckIds) {
|
|
|
//如任务不存在,则删除时间缓存
|
|
|
- if (!FUTURE_CACHE.containsKey(taskId)) TIME_CACHE.remove(taskId);
|
|
|
+ if (!TASK_CACHE.containsKey(systemCheckId)) TIME_CACHE.remove(systemCheckId);
|
|
|
//停用缓存
|
|
|
- if (stopTask(taskId)) TIME_CACHE.remove(taskId);
|
|
|
+ if (stopTask(systemCheckId)) TIME_CACHE.remove(systemCheckId);
|
|
|
else {
|
|
|
//打印报错信息
|
|
|
LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
|
|
|
, String.format(
|
|
|
- "过期任务停止失败 ttl:%s taskId:%s"
|
|
|
+ "过期任务停止失败 ttl:%s 系统检查id:%s"
|
|
|
, ttl
|
|
|
- , taskId
|
|
|
+ , systemCheckId
|
|
|
)
|
|
|
);
|
|
|
}
|
|
@@ -158,54 +184,61 @@ public class GisSurveyBizService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 生成任务标识
|
|
|
+ * 获取更新时间
|
|
|
*
|
|
|
- * @param params 系统检查参数
|
|
|
- * @return 任务标识
|
|
|
+ * @param systemCheckId 系统检查id
|
|
|
+ * @return 元素更新时间
|
|
|
*/
|
|
|
- private GisSurveyCheckTaskId generateTaskId(GisSurveyCheckParams params) {
|
|
|
- //获取枚举
|
|
|
- GisSurveyCheckTypeEnum checkTypeEnum = Arrays.stream(GisSurveyCheckTypeEnum.values())
|
|
|
- .filter(enumeration -> Objects.equals(params.getCheckType(), enumeration.getCode()))
|
|
|
- .findFirst().orElse(null);
|
|
|
- if (checkTypeEnum == null) return null;
|
|
|
- //项目维度
|
|
|
- if (checkTypeEnum.equals(GisSurveyCheckTypeEnum.PROJECT)) {
|
|
|
- return new GisSurveyCheckTaskId(GisSurveyCheckTypeEnum.PROJECT.getCode(), params.getProjId());
|
|
|
- }
|
|
|
- //任务维度
|
|
|
- else if (checkTypeEnum.equals(GisSurveyCheckTypeEnum.JOB)) {
|
|
|
- return new GisSurveyCheckTaskId(GisSurveyCheckTypeEnum.PROJECT.getCode(), params.getJobId());
|
|
|
- }
|
|
|
- return null;
|
|
|
+ private LocalDateTime getRefreshTimeDuration(GisSurveySystemCheckId systemCheckId) {
|
|
|
+ //默认为当前时间
|
|
|
+ LocalDateTime refreshTime = LocalDateTime.now();
|
|
|
+ //根据检查维度获取数据库里的更新时间
|
|
|
+ if (systemCheckId.getCheckType() == GisSurveyCheckTypeEnum.PROJECT)
|
|
|
+ refreshTime = projectInfoService.findRefreshTimeByUid(systemCheckId.getCode());
|
|
|
+ if (systemCheckId.getCheckType() == GisSurveyCheckTypeEnum.JOB)
|
|
|
+ refreshTime = jobInfoService.findRefreshTimeByUid(systemCheckId.getCode());
|
|
|
+ return refreshTime;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 启动任务
|
|
|
*
|
|
|
- * @param taskId 任务id
|
|
|
- * @param params 检查参数
|
|
|
+ * @param systemCheckId 系统检查id
|
|
|
+ * @param params 检查参数
|
|
|
*/
|
|
|
- private void startTask(GisSurveyCheckTaskId taskId, GisSurveyCheckParams params) {
|
|
|
+ private void startTask(GisSurveySystemCheckId systemCheckId, GisSurveyCheckParams params) {
|
|
|
+ //获取已存在的任务
|
|
|
+ ListenableFuture<GisSurveySystemCheckResult> previousFuture = TASK_CACHE.get(systemCheckId);
|
|
|
+ //已结束判断,删除缓存
|
|
|
+ if (previousFuture != null && (previousFuture.isDone() || previousFuture.isCancelled())) {
|
|
|
+ TASK_CACHE.remove(systemCheckId);
|
|
|
+ SUBTASK_CACHE.remove(systemCheckId);
|
|
|
+ TIME_CACHE.remove(systemCheckId);
|
|
|
+ }
|
|
|
//异步执行系统检查任务
|
|
|
- ListenableFuture<GisSurveyCheckResult> checkFuture = systemChecker.systemCheckTask(params);
|
|
|
+ ListenableFuture<GisSurveySystemCheckResult> checkFuture = systemChecker.systemCheckTask(params,
|
|
|
+ //缓存子任务句柄
|
|
|
+ subtask -> SUBTASK_CACHE.put(systemCheckId, subtask),
|
|
|
+ //删除子任务句柄
|
|
|
+ subtaskSystemCheckId -> SUBTASK_CACHE.remove(systemCheckId)
|
|
|
+ );
|
|
|
//缓存任务句柄
|
|
|
- FUTURE_CACHE.put(taskId, checkFuture);
|
|
|
+ TASK_CACHE.put(systemCheckId, checkFuture);
|
|
|
//缓存时间
|
|
|
- TIME_CACHE.put(taskId, LocalDateTime.now());
|
|
|
+ TIME_CACHE.put(systemCheckId, LocalDateTime.now());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 关闭检查任务
|
|
|
+ * 停止任务
|
|
|
*
|
|
|
* @param taskId 任务id
|
|
|
* @return 关闭状态
|
|
|
*/
|
|
|
- private Boolean stopTask(GisSurveyCheckTaskId taskId) {
|
|
|
- ListenableFuture<GisSurveyCheckResult> future = FUTURE_CACHE.get(taskId);
|
|
|
+ private Boolean stopTask(GisSurveySystemCheckId taskId) {
|
|
|
+ ListenableFuture<GisSurveySystemCheckResult> future = TASK_CACHE.get(taskId);
|
|
|
//完成判断,完成删除缓存
|
|
|
if (future.isCancelled() || future.isDone()) {
|
|
|
- FUTURE_CACHE.remove(taskId);
|
|
|
+ TASK_CACHE.remove(taskId);
|
|
|
TIME_CACHE.remove(taskId);
|
|
|
return true;
|
|
|
}
|
|
@@ -213,7 +246,7 @@ public class GisSurveyBizService {
|
|
|
boolean cancel = future.cancel(true);
|
|
|
//清除成功,删除缓存
|
|
|
if (cancel) {
|
|
|
- FUTURE_CACHE.remove(taskId);
|
|
|
+ TASK_CACHE.remove(taskId);
|
|
|
TIME_CACHE.remove(taskId);
|
|
|
return true;
|
|
|
}
|