|
@@ -3,20 +3,23 @@ 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.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;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -32,23 +35,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,22 +74,40 @@ 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);
|
|
|
+ ListenableFuture<GisSurveySystemCheckResult> previousFuture = TASK_CACHE.get(systemCheckId);
|
|
|
+ //获取已存在的结果
|
|
|
+ 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 GisSurveyCheckResult.inProgress(params, TIME_CACHE.get(taskId));
|
|
|
- //已结束判断,删除缓存
|
|
|
- if (previousFuture != null && (previousFuture.isDone() || previousFuture.isCancelled()))
|
|
|
- FUTURE_CACHE.remove(taskId);
|
|
|
+ return GisSurveySystemCheckResult.inProgress(params, checkSubtask, TIME_CACHE.get(systemCheckId));
|
|
|
//启动检查任务
|
|
|
- startTask(taskId, params);
|
|
|
+ startTask(systemCheckId, params);
|
|
|
//返回进行中
|
|
|
- return GisSurveyCheckResult.inProgress(params, LocalDateTime.now());
|
|
|
+ return GisSurveySystemCheckResult.inProgress(params, checkSubtask, LocalDateTime.now());
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -81,19 +116,19 @@ public class GisSurveyBizService {
|
|
|
* @param params 系统检查参数
|
|
|
* @return 检查结果(可能进行中)
|
|
|
*/
|
|
|
- public GisSurveyCheckResult getResult(GisSurveyCheckParams params) {
|
|
|
+ public GisSurveySystemCheckResult getResult(GisSurveyCheckParams params) {
|
|
|
//任务标识
|
|
|
- GisSurveyCheckTaskId taskId = generateTaskId(params);
|
|
|
- if (taskId == null) return GisSurveyCheckResult.notExists(params);
|
|
|
+ GisSurveySystemCheckId systemCheckId = GisSurveySystemCheckId.generateId(params);
|
|
|
+ if (systemCheckId == null) return GisSurveySystemCheckResult.notExists(params);
|
|
|
//获取任务
|
|
|
- ListenableFuture<GisSurveyCheckResult> checkFuture = FUTURE_CACHE.get(taskId);
|
|
|
- if (checkFuture == null) return GisSurveyCheckResult.notExists(params);
|
|
|
+ ListenableFuture<GisSurveySystemCheckResult> checkFuture = TASK_CACHE.get(systemCheckId);
|
|
|
+ if (checkFuture == null) return GisSurveySystemCheckResult.notExists(params);
|
|
|
//已结束,则直接返回失败(如完成cancelled为false,切无法clear)
|
|
|
- if (checkFuture.isCancelled()) return GisSurveyCheckResult.fail(params);
|
|
|
+ if (checkFuture.isCancelled()) return GisSurveySystemCheckResult.fail(params);
|
|
|
//完成判断,如完成直接返回结果
|
|
|
if (checkFuture.isDone()) {
|
|
|
try {
|
|
|
- return FUTURE_CACHE.get(taskId).get();
|
|
|
+ return TASK_CACHE.get(systemCheckId).get();
|
|
|
} catch (ExecutionException | InterruptedException e) {
|
|
|
//打印报错信息(不太可能走到这里)
|
|
|
LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
|
|
@@ -103,11 +138,11 @@ public class GisSurveyBizService {
|
|
|
, e.getMessage()
|
|
|
)
|
|
|
);
|
|
|
- return GisSurveyCheckResult.fail(params);
|
|
|
+ return GisSurveySystemCheckResult.fail(params);
|
|
|
}
|
|
|
}
|
|
|
//返回进行中
|
|
|
- return GisSurveyCheckResult.inProgress(params, TIME_CACHE.get(taskId));
|
|
|
+ return GisSurveySystemCheckResult.inProgress(params, SUBTASK_CACHE.get(systemCheckId), TIME_CACHE.get(systemCheckId));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -116,30 +151,30 @@ public class GisSurveyBizService {
|
|
|
* @param params 系统检查参数
|
|
|
* @return 检查结果(可能进行中)
|
|
|
*/
|
|
|
- public GisSurveyCheckResult delResult(GisSurveyCheckParams params) {
|
|
|
+ public GisSurveySystemCheckResult delResult(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>
|
|
|
*/
|
|
|
- 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()).toMillis() > ttl)
|
|
|
+ List<GisSurveySystemCheckId> taskIds = 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 taskId : taskIds) {
|
|
|
//如任务不存在,则删除时间缓存
|
|
|
- if (!FUTURE_CACHE.containsKey(taskId)) TIME_CACHE.remove(taskId);
|
|
|
+ if (!TASK_CACHE.containsKey(taskId)) TIME_CACHE.remove(taskId);
|
|
|
//停用缓存
|
|
|
if (stopTask(taskId)) TIME_CACHE.remove(taskId);
|
|
|
else {
|
|
@@ -156,41 +191,46 @@ 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;
|
|
|
+ public 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)
|
|
|
+ );
|
|
|
//缓存任务句柄
|
|
|
- FUTURE_CACHE.put(taskId, checkFuture);
|
|
|
+ TASK_CACHE.put(systemCheckId, checkFuture);
|
|
|
//缓存时间
|
|
|
- TIME_CACHE.put(taskId, LocalDateTime.now());
|
|
|
+ TIME_CACHE.put(systemCheckId, LocalDateTime.now());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -199,11 +239,11 @@ public class GisSurveyBizService {
|
|
|
* @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;
|
|
|
}
|
|
@@ -211,7 +251,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;
|
|
|
}
|