REM:
1. 增加REST-ful接口请求超时检查
2. 修正启动处置任务时,未能判断当前相同用户,设备,处置IP的任务是否在运行的问题
3. 系统启动时,根据配置文件配置REST-ful接口请求超时检查开关
4. 修正停止处置任务失败时,恢复任务状态不正确问题
This commit is contained in:
HuangXin 2020-04-30 17:50:54 +08:00
parent 05701262b1
commit 7ac90a3c35
9 changed files with 60 additions and 22 deletions

View File

@ -54,10 +54,6 @@ public class ConstValue {
* The type Protocol. * The type Protocol.
*/ */
public static class Protocol { public static class Protocol {
/**
* The constant RESP_CMD_BASE.
*/
public static final int RESP_CMD_BASE = 10000;
/** /**
* The constant VERSION. * The constant VERSION.
*/ */
@ -74,6 +70,8 @@ public class ConstValue {
* The constant CRYPTO_AES256. * The constant CRYPTO_AES256.
*/ */
public static final int CRYPTO_AES256 = 2; public static final int CRYPTO_AES256 = 2;
public static final int REQUEST_TIMEOUT_MS = 10 * 1000;
} }
/** /**

View File

@ -130,7 +130,15 @@ public enum ErrorCode {
*/ */
ERR_NOSUCHTASK(30, "没有该任务"), ERR_NOSUCHTASK(30, "没有该任务"),
/**
* Err tasknotrunning error code.
*/
ERR_TASKNOTRUNNING(31, "该任务没有运行"), ERR_TASKNOTRUNNING(31, "该任务没有运行"),
/**
* Err requesttimeout error code.
*/
ERR_REQUESTTIMEOUT(32, "请求超时"),
; ;
/** /**

View File

@ -25,4 +25,9 @@ public class GlobalVar {
* The constant USED_VIRTUAL_DISPOSE_MODE. * The constant USED_VIRTUAL_DISPOSE_MODE.
*/ */
public static volatile boolean USED_VIRTUAL_DISPOSE_MODE = false; public static volatile boolean USED_VIRTUAL_DISPOSE_MODE = false;
/**
* The constant IS_CHECK_REQUEST_TIMEOUT.
*/
public static volatile boolean IS_CHECK_REQUEST_TIMEOUT = false;
} }

View File

@ -1,5 +1,6 @@
package com.dispose.config; package com.dispose.config;
import com.dispose.common.GlobalVar;
import com.dispose.service.DisposeNodeManager; import com.dispose.service.DisposeNodeManager;
import com.dispose.service.TaskService; import com.dispose.service.TaskService;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -13,6 +14,12 @@ import org.springframework.stereotype.Component;
@Component @Component
@Slf4j @Slf4j
public class SetupInit implements CommandLineRunner { public class SetupInit implements CommandLineRunner {
/**
* The Dispose configure.
*/
@Resource
private DisposeConfigure disposeConfigure;
/** /**
* The Dispose node manager. * The Dispose node manager.
*/ */
@ -33,6 +40,7 @@ public class SetupInit implements CommandLineRunner {
@Override @Override
public void run(String... args) { public void run(String... args) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
GlobalVar.IS_CHECK_REQUEST_TIMEOUT = Boolean.parseBoolean(disposeConfigure.getCheckProtocolTimeout());
log.info("System Setup................................................"); log.info("System Setup................................................");
disposeNodeManager.loadDisposeNodeFromDB(); disposeNodeManager.loadDisposeNodeFromDB();
taskService.loadTaskFromDatabase(); taskService.loadTaskFromDatabase();

View File

@ -98,7 +98,7 @@ public class DisposeTaskController {
StartTaskRsp rspInfo = new StartTaskRsp(); StartTaskRsp rspInfo = new StartTaskRsp();
TaskInfoDetail task = TaskInfoDetail.builder() TaskInfoDetail task = TaskInfoDetail.builder()
.id(Long.valueOf(reqInfo.getId())) .deviceId(Long.valueOf(reqInfo.getId()))
.accountId(userAccountService.getUserByToken(mr.getAuthToken()).getId()) .accountId(userAccountService.getUserByToken(mr.getAuthToken()).getId())
.type(reqInfo.getType()) .type(reqInfo.getType())
.disposeIp(reqInfo.getDisposeIp()) .disposeIp(reqInfo.getDisposeIp())

View File

@ -2,15 +2,17 @@ package com.dispose.pojo.dto;
import com.dispose.common.ConstValue; import com.dispose.common.ConstValue;
import com.dispose.common.ErrorCode; import com.dispose.common.ErrorCode;
import com.dispose.common.GlobalVar;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Objects;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import java.util.Objects;
/** /**
* The type Protocol req dto. * The type Protocol req dto.
*/ */
@ -59,14 +61,20 @@ public class ProtocolReqDTO extends ProtocolDTO {
*/ */
public ErrorCode verifyRequest(HttpHeaders headers) { public ErrorCode verifyRequest(HttpHeaders headers) {
ErrorCode err = verifyRequest();
if (err != ErrorCode.ERR_OK) {
return err;
}
if (headers == null) { if (headers == null) {
return ErrorCode.ERR_MISSAUTHHEAD; return ErrorCode.ERR_MISSAUTHHEAD;
} }
try { try {
ProtocolReqDTO.token = Objects. ProtocolReqDTO.token = Objects.
requireNonNull(headers.get("Authorization")) requireNonNull(headers.get("Authorization"))
.get(0).replaceFirst("Bearer ", ""); .get(0).replaceFirst("Bearer ", "");
} catch (Exception ex) { } catch (Exception ex) {
return ErrorCode.ERR_MISSAUTHHEAD; return ErrorCode.ERR_MISSAUTHHEAD;
} }
@ -93,6 +101,11 @@ public class ProtocolReqDTO extends ProtocolDTO {
return ErrorCode.ERR_VERSION; return ErrorCode.ERR_VERSION;
} }
if (GlobalVar.IS_CHECK_REQUEST_TIMEOUT
&& System.currentTimeMillis() - this.getTimeStamp() >= ConstValue.Protocol.REQUEST_TIMEOUT_MS) {
return ErrorCode.ERR_REQUESTTIMEOUT;
}
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;
} }
} }

View File

@ -131,12 +131,13 @@ public class TaskServiceImpl implements TaskService {
@Override @Override
public MReturnType<ErrorCode, Long> createTask(TaskInfoDetail task) { public MReturnType<ErrorCode, Long> createTask(TaskInfoDetail task) {
DisposeDevice disposeDevice; DisposeDevice disposeDevice;
Long taskId = task.getDeviceId();
// 首先查找有没有能处置这个ip的能力节点 // 首先查找有没有能处置这个ip的能力节点
if (task.getId() == null || task.getId() < 0) { // 没有指定处置能力节点的情况 if (taskId == null || taskId < 0) { // 没有指定处置能力节点的情况
disposeDevice = getDisposeNode(task.getDisposeIp(), task.getType()); disposeDevice = getDisposeNode(task.getDisposeIp(), task.getType());
} else { // 指定了处置能力节点的情况 } else { // 指定了处置能力节点的情况
disposeDevice = disposeNodeManager.getDisposeDeviceById(task.getId()); disposeDevice = disposeNodeManager.getDisposeDeviceById(taskId);
} }
if (disposeDevice == null) { if (disposeDevice == null) {
@ -146,14 +147,14 @@ public class TaskServiceImpl implements TaskService {
.build(); .build();
} else { } else {
task.setDeviceId(disposeDevice.getId()); task.setDeviceId(disposeDevice.getId());
task.setAccountId(task.getAccountId());
} }
// 查询当前是否有相同能力节点相同用户相同处置IP的且正在执行的处置任务如果存在则忽略该次任务依照产品需求 // 查询当前是否有相同能力节点相同用户相同处置IP的且正在执行的处置任务如果存在则忽略该次任务依照产品需求
List<TaskInfoDetail> taskList = taskCacheManager.getAllTask() List<TaskInfoDetail> taskList = taskCacheManager.getAllTask()
.parallelStream() .parallelStream()
.filter(v -> ((v.getId() == null || v.getId() == -1L) || Objects.equals(v.getId(), task.getDeviceId())) .filter(v -> ((taskId == null || taskId == -1L) || Objects.equals(v.getDeviceId(), task.getDeviceId()))
&& Objects.equals(v.getAccountId(), task.getAccountId()) && Objects.equals(v.getAccountId(), task.getAccountId())
&& taskIsRunning(v)
&& Objects.equals(v.getType(), task.getType()) && Objects.equals(v.getType(), task.getType())
&& Objects.equals(v.getDisposeIp(), task.getDisposeIp())) && Objects.equals(v.getDisposeIp(), task.getDisposeIp()))
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -241,12 +242,6 @@ public class TaskServiceImpl implements TaskService {
@Override @Override
public ErrorCode stopTask(Long taskId) { public ErrorCode stopTask(Long taskId) {
ErrorCode err = taskCacheManager.upgradeTaskStatus(taskId, DisposeTaskStatus.TASK_STOP.getCode());
if (err != ErrorCode.ERR_OK) {
return err;
}
TaskInfoDetail task = taskCacheManager.getTaskById(taskId); TaskInfoDetail task = taskCacheManager.getTaskById(taskId);
if (task != null) { if (task != null) {
@ -258,6 +253,12 @@ public class TaskServiceImpl implements TaskService {
int prdStatus = task.getCurrentStatus(); int prdStatus = task.getCurrentStatus();
ErrorCode err = taskCacheManager.upgradeTaskStatus(taskId, DisposeTaskStatus.TASK_STOP.getCode());
if (err != ErrorCode.ERR_OK) {
return err;
}
// 异步启动处置任务 // 异步启动处置任务
CompletableFuture.supplyAsync(() -> dp.stopDispose(task.getDisposeIp(), DeviceCapacity.values()[task.getType()])) CompletableFuture.supplyAsync(() -> dp.stopDispose(task.getDisposeIp(), DeviceCapacity.values()[task.getType()]))
.whenComplete((v, ex) -> { .whenComplete((v, ex) -> {
@ -276,6 +277,8 @@ public class TaskServiceImpl implements TaskService {
} }
} }
}); });
} else {
return ErrorCode.ERR_NOSUCHTASK;
} }
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;

View File

@ -4,8 +4,6 @@ import com.dispose.common.ErrorCode;
import com.dispose.common.GlobalVar; import com.dispose.common.GlobalVar;
import com.dispose.pojo.po.MReturnType; import com.dispose.pojo.po.MReturnType;
import com.dispose.service.UserAccountService; import com.dispose.service.UserAccountService;
import java.util.Iterator;
import javax.annotation.Resource;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.json.JSONException; import org.json.JSONException;
@ -15,6 +13,9 @@ import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import javax.annotation.Resource;
import java.util.Iterator;
/** /**
* The type Init test environment. * The type Init test environment.
*/ */
@ -50,6 +51,8 @@ public class InitTestEnvironment {
@BeforeClass @BeforeClass
public static void initVirtualDevice() { public static void initVirtualDevice() {
GlobalVar.USED_VIRTUAL_DISPOSE_MODE = true; GlobalVar.USED_VIRTUAL_DISPOSE_MODE = true;
GlobalVar.IS_CHECK_REQUEST_TIMEOUT = true;
log.warn("Current Used Virtual Dispose Device"); log.warn("Current Used Virtual Dispose Device");
} }
@ -114,7 +117,7 @@ public class InitTestEnvironment {
Assert.assertEquals(err, ErrorCode.ERR_OK); Assert.assertEquals(err, ErrorCode.ERR_OK);
if ((jsonObject.getString("code").length() == 0) || if ((jsonObject.getString("code").length() == 0) ||
Long.parseLong(jsonObject.getString("code")) != 200) { Long.parseLong(jsonObject.getString("code")) != 200) {
err = ErrorCode.ERR_UNKNOWNCMD; err = ErrorCode.ERR_UNKNOWNCMD;
} }
Assert.assertEquals(err, ErrorCode.ERR_OK); Assert.assertEquals(err, ErrorCode.ERR_OK);

View File

@ -30,6 +30,6 @@ public class TaskServiceTest extends InitTestEnvironment {
public void t1_stopTaskTest() { public void t1_stopTaskTest() {
ErrorCode err = taskService.stopTask(-1L); ErrorCode err = taskService.stopTask(-1L);
Assert.assertEquals(err, ErrorCode.ERR_NOSUCHDEVICE); Assert.assertNotEquals(err, ErrorCode.ERR_OK);
} }
} }