REM:
1. 更新测试环境配置文件
2. 删除冗余的全局配置项
3. 任务管理定时器轮询时间改为1s
4. 增加核心业务注释
5. 增加关键点log日志
This commit is contained in:
HuangXin 2020-05-07 19:00:20 +08:00
parent f2b93005e3
commit afae01470e
16 changed files with 127 additions and 100 deletions

View File

@ -52,6 +52,6 @@ phoenix.response-enc-switch=false
phoenix.aes-key=Wt4EJu6Rrq5udd/42bNpCQ== phoenix.aes-key=Wt4EJu6Rrq5udd/42bNpCQ==
#====custom config,begin with phoenix==== #====custom config,begin with phoenix====
#调试配置 #调试配置
dispose.check-protocol-timeout=false dispose.check-protocol-timeout=true
dispose.check-request-token=true dispose.check-request-token=true
dispose.check-admin-permission=true dispose.check-admin-permission=true

View File

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

View File

@ -17,6 +17,7 @@ public class EncodingFilterConfig {
*/ */
@Bean @Bean
public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean() { public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean() {
// 设置控制器返回HTTP头编码格式为UTF8
FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>(); FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setForceEncoding(true); characterEncodingFilter.setForceEncoding(true);

View File

@ -39,9 +39,8 @@ public class SetupInit implements CommandLineRunner {
*/ */
@Override @Override
public void run(String... args) { public void run(String... args) {
// TODO Auto-generated method stub // 系统初始化入口
GlobalVar.IS_CHECK_REQUEST_TIMEOUT = Boolean.parseBoolean(disposeConfigure.getCheckProtocolTimeout()); GlobalVar.IS_CHECK_REQUEST_TIMEOUT = Boolean.parseBoolean(disposeConfigure.getCheckProtocolTimeout());
log.info("System Setup................................................");
disposeNodeManager.loadDisposeNodeFromDB(); disposeNodeManager.loadDisposeNodeFromDB();
taskService.loadTaskFromDatabase(); taskService.loadTaskFromDatabase();
} }

View File

@ -39,20 +39,25 @@ public class DeviceRouter {
public static DisposeEntryManager deviceRouterFactory(int devType, String ipAddr, IPAddrType ipType) { public static DisposeEntryManager deviceRouterFactory(int devType, String ipAddr, IPAddrType ipType) {
String mapKey = getMapKey(devType, ipAddr); String mapKey = getMapKey(devType, ipAddr);
// 判断缓存中是否创建过对象如果创建过直接从缓存中获取
if (DEVICE_CACHE_MAP.containsKey(mapKey)) { if (DEVICE_CACHE_MAP.containsKey(mapKey)) {
return DEVICE_CACHE_MAP.get(mapKey); return DEVICE_CACHE_MAP.get(mapKey);
} else { } else {
// 第一次访问创建新对象并缓存
if (GlobalVar.USED_VIRTUAL_DISPOSE_MODE) { if (GlobalVar.USED_VIRTUAL_DISPOSE_MODE) {
// 虚拟设备供调试业务使用
DisposeEntryManager dev = new VirtualDeviceImpl(ipAddr); DisposeEntryManager dev = new VirtualDeviceImpl(ipAddr);
DEVICE_CACHE_MAP.put(mapKey, dev); DEVICE_CACHE_MAP.put(mapKey, dev);
return dev; return dev;
} else if (devType == DisposeDeviceType.DPTECH_UMC.getCode()) { } else if (devType == DisposeDeviceType.DPTECH_UMC.getCode()) {
// 迪普设备
DisposeEntryManager dev = new DPTechImpl(ipAddr); DisposeEntryManager dev = new DPTechImpl(ipAddr);
DEVICE_CACHE_MAP.put(mapKey, dev); DEVICE_CACHE_MAP.put(mapKey, dev);
return dev; return dev;
} }
} }
// 始终返回一个虚拟设备作为默认设备
DisposeEntryManager dev = new VirtualDeviceImpl(ipAddr); DisposeEntryManager dev = new VirtualDeviceImpl(ipAddr);
DEVICE_CACHE_MAP.put(mapKey, dev); DEVICE_CACHE_MAP.put(mapKey, dev);
return dev; return dev;

View File

@ -16,6 +16,7 @@ public class SoapPasswordCallbackHandler implements CallbackHandler {
*/ */
@Override @Override
public void handle(Callback[] callbacks) { public void handle(Callback[] callbacks) {
// DPTech SOAP接口WSSecure头部密码填充
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword(ConstValue.SOAPWrapperConst.PASSWORD); pc.setPassword(ConstValue.SOAPWrapperConst.PASSWORD);
} }

View File

@ -48,17 +48,19 @@ public class TokenInterceptor implements HandlerInterceptor {
response.setContentType("application/json;charset=UTF-8"); response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write(new ObjectMapper().writeValueAsString(ProtocolRespDTO.result(err))); response.getWriter().write(new ObjectMapper().writeValueAsString(ProtocolRespDTO.result(err)));
log.error("Http request token [{}] is error: {}", token, err);
return false; return false;
} }
} else { } else {
// 缺少必要的认证头部
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8"); response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.getWriter().write(new ObjectMapper().writeValueAsString(ProtocolRespDTO.result(ErrorCode.ERR_MISSAUTHHEAD))); response.getWriter().write(new ObjectMapper().writeValueAsString(ProtocolRespDTO.result(ErrorCode.ERR_MISSAUTHHEAD)));
log.error("Http request head miss \"Authorization\" item");
return false; return false;
} }
return true; return true;
} }
} }

View File

@ -52,6 +52,7 @@ public class TaskCacheManagerImpl implements TaskCacheManager {
*/ */
@Override @Override
public ErrorCode addTask(TaskInfoDetail taskData) { public ErrorCode addTask(TaskInfoDetail taskData) {
// 输入参数验证
if (taskData == null if (taskData == null
|| taskData.getDisposeIp() == null || taskData.getDisposeIp() == null
|| taskData.getDisposeIp().length() == 0 || taskData.getDisposeIp().length() == 0
@ -59,11 +60,13 @@ public class TaskCacheManagerImpl implements TaskCacheManager {
return ErrorCode.ERR_INPUTMISS; return ErrorCode.ERR_INPUTMISS;
} }
// 判断任务是否已经存在
if (taskCacheMap.containsKey(taskData.getId())) { if (taskCacheMap.containsKey(taskData.getId())) {
return ErrorCode.ERR_DEVICEEXISTS; return ErrorCode.ERR_DEVICEEXISTS;
} }
taskData.setRetryTimes(0); // 添加到Map缓存中
taskData.setRetryTimes(0); // 保留字段
taskCacheMap.put(taskData.getId(), taskData); taskCacheMap.put(taskData.getId(), taskData);
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;
} }
@ -91,6 +94,7 @@ public class TaskCacheManagerImpl implements TaskCacheManager {
return ErrorCode.ERR_NOSUCHDEVICE; return ErrorCode.ERR_NOSUCHDEVICE;
} }
// 更新状态
taskCacheMap.get(id).setCurrentStatus(status); taskCacheMap.get(id).setCurrentStatus(status);
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;

View File

@ -57,9 +57,10 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
String username = getUsernameByToken(token); String username = getUsernameByToken(token);
if (username == null) { if (username == null || username.length() == 0) {
return ErrorCode.ERR_LOGOUT; return ErrorCode.ERR_LOGOUT;
} else if ("admin".equals(username)) { } else if ("admin".equals(username)) {
// admin 用户具有操作权限
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;
} }
@ -89,16 +90,20 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
*/ */
@Override @Override
public ErrorCode verifyToken(String token) { public ErrorCode verifyToken(String token) {
//userAccountMap // 判断当前token是否存在如果不存在则用户没有登录
if (!userAccountCache.containsKey(token)) { if (!userAccountCache.containsKey(token)) {
return ErrorCode.ERR_LOGOUT; return ErrorCode.ERR_LOGOUT;
} else { } else {
UserAccountCache uc = userAccountCache.get(token); UserAccountCache uc = userAccountCache.get(token);
// 根据token提取用户信息判断当前token是否超时
if ((System.currentTimeMillis() - uc.getLastAccess()) if ((System.currentTimeMillis() - uc.getLastAccess())
>= ConstValue.GlobalConfigure.TOKEN_TIMEOUT_MS) { >= ConstValue.GlobalConfigure.TOKEN_TIMEOUT_MS) {
log.error("User {} token timeout before {}", uc.getUsername(), uc.getLastAccess());
return ErrorCode.ERR_TOKENTIMEOUT; return ErrorCode.ERR_TOKENTIMEOUT;
} else {
// 更新用户最后一次访问时间戳
uc.setLastAccess(System.currentTimeMillis());
} }
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;
@ -114,25 +119,30 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
*/ */
@Override @Override
public ErrorCode verifyUserLogin(String username, String token) { public ErrorCode verifyUserLogin(String username, String token) {
// 缓存中通过用户名查找当前用户
Optional<UserAccountCache> findRet = userAccountCache.values().stream() Optional<UserAccountCache> findRet = userAccountCache.values().stream()
.filter(userAccountCache -> username.equals(userAccountCache.getUsername())) .filter(userAccountCache -> username.equals(userAccountCache.getUsername()))
.findFirst(); .findFirst();
// 用户不存在
if (!findRet.isPresent()) { if (!findRet.isPresent()) {
return ErrorCode.ERR_LOGOUT; return ErrorCode.ERR_LOGOUT;
} }
UserAccountCache uc = findRet.get(); UserAccountCache uc = findRet.get();
// 如果token为空说明用户没有登录
if (uc.getToken().length() == 0) { if (uc.getToken().length() == 0) {
return ErrorCode.ERR_LOGOUT; return ErrorCode.ERR_LOGOUT;
} }
// 判断用户访问时间间隔是否超时
if ((System.currentTimeMillis() - uc.getLastAccess()) if ((System.currentTimeMillis() - uc.getLastAccess())
>= ConstValue.GlobalConfigure.TOKEN_TIMEOUT_MS) { >= ConstValue.GlobalConfigure.TOKEN_TIMEOUT_MS) {
return ErrorCode.ERR_TOKENTIMEOUT; return ErrorCode.ERR_TOKENTIMEOUT;
} }
// 判断token是否正确
if (!uc.getToken().equals(token)) { if (!uc.getToken().equals(token)) {
return ErrorCode.ERR_TOKENNOTFOUND; return ErrorCode.ERR_TOKENNOTFOUND;
} }
@ -158,12 +168,14 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
*/ */
@Override @Override
public void cleanUserToken(String username) { public void cleanUserToken(String username) {
// 根据用户名在缓存中查找用户
Optional<UserAccountCache> findRet = userAccountCache.values().stream() Optional<UserAccountCache> findRet = userAccountCache.values().stream()
.filter(userAccountCache -> username.equals(userAccountCache.getUsername())) .filter(userAccountCache -> username.equals(userAccountCache.getUsername()))
.findFirst(); .findFirst();
if (findRet.isPresent()) { if (findRet.isPresent()) {
UserAccountCache uc = findRet.get(); UserAccountCache uc = findRet.get();
// 缓存中删除当前用户
userAccountCache.remove(uc.getToken()); userAccountCache.remove(uc.getToken());
} }
} }
@ -184,6 +196,7 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
UserAccountCache uc = findRet.get(); UserAccountCache uc = findRet.get();
return uc.getPwdErrTimes(); return uc.getPwdErrTimes();
} else { } else {
// 缓存不存在说明用户未登录过或者已经过期创建一个新用户缓存
UserAccountCache uc = UserAccountCache.builder() UserAccountCache uc = UserAccountCache.builder()
.username(username) .username(username)
.token("") .token("")
@ -223,7 +236,7 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
*/ */
@Override @Override
public String getUserToken(String username) throws NoSuchAlgorithmException { public String getUserToken(String username) throws NoSuchAlgorithmException {
// 根据用户名在缓存中查找用户
Optional<UserAccountCache> findRet = userAccountCache.values().stream() Optional<UserAccountCache> findRet = userAccountCache.values().stream()
.filter(userAccountCache -> username.equals(userAccountCache.getUsername())) .filter(userAccountCache -> username.equals(userAccountCache.getUsername()))
.findFirst(); .findFirst();
@ -231,6 +244,7 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
if (findRet.isPresent()) { if (findRet.isPresent()) {
UserAccountCache uc = findRet.get(); UserAccountCache uc = findRet.get();
// token过期获取以前没有token创建一个新token
if ((System.currentTimeMillis() - uc.getLastAccess()) if ((System.currentTimeMillis() - uc.getLastAccess())
>= ConstValue.GlobalConfigure.TOKEN_TIMEOUT_MS >= ConstValue.GlobalConfigure.TOKEN_TIMEOUT_MS
|| uc.getToken().length() == 0) { || uc.getToken().length() == 0) {
@ -244,6 +258,7 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
return uc.getToken(); return uc.getToken();
} else { } else {
// 用户不存在说明没有登陆过创建一个新的用户缓存
UserAccountCache uc = UserAccountCache.builder() UserAccountCache uc = UserAccountCache.builder()
.username(username) .username(username)
.token(createUserToken(username)) .token(createUserToken(username))
@ -268,7 +283,7 @@ public class UserAccountCacheManagerImpl implements UserAccountCacheManager {
*/ */
private String createUserToken(String username) throws NoSuchAlgorithmException { private String createUserToken(String username) throws NoSuchAlgorithmException {
// 获取指定摘要算法的messageDigest对象 // 获取指定摘要算法的messageDigest对象
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); // 此处的sha代表sha1 MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
String tokenKey = username + String tokenKey = username +
Convert.toStr(RANDOM_GEN.nextInt()) + Convert.toStr(RANDOM_GEN.nextInt()) +

View File

@ -39,6 +39,7 @@ public class ProtocolReqDTO extends ProtocolDTO {
* @throws JsonProcessingException the json processing exception * @throws JsonProcessingException the json processing exception
*/ */
public <T> T getRequestObject(Class<T> objType) throws JsonProcessingException { public <T> T getRequestObject(Class<T> objType) throws JsonProcessingException {
// 返回协议 MsgContent 字段内容
return OBJECT_MAPPER.readValue(this.getMsgContent(), objType); return OBJECT_MAPPER.readValue(this.getMsgContent(), objType);
} }
@ -49,7 +50,6 @@ public class ProtocolReqDTO extends ProtocolDTO {
*/ */
@JsonIgnore @JsonIgnore
public String getAuthToken() { public String getAuthToken() {
return ProtocolReqDTO.token; return ProtocolReqDTO.token;
} }
@ -67,26 +67,19 @@ public class ProtocolReqDTO extends ProtocolDTO {
return err; return err;
} }
// 是否有必要的HTTP Head字段
if (headers == null) { if (headers == null) {
return ErrorCode.ERR_MISSAUTHHEAD; return ErrorCode.ERR_MISSAUTHHEAD;
} }
try { try {
ProtocolReqDTO.token = Objects. // 保持当前请求token内容
requireNonNull(headers.get("Authorization")) ProtocolReqDTO.token = Objects.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;
} }
if (ProtocolReqDTO.token.length() == 0) {
return ErrorCode.ERR_MISSAUTHHEAD;
}
if (this.getVer() < ConstValue.Protocol.VERSION) {
return ErrorCode.ERR_VERSION;
}
return ErrorCode.ERR_OK; return ErrorCode.ERR_OK;
} }
@ -96,13 +89,14 @@ public class ProtocolReqDTO extends ProtocolDTO {
* @return the error code * @return the error code
*/ */
public ErrorCode verifyRequest() { public ErrorCode verifyRequest() {
// 校验版本
if (this.getVer() < ConstValue.Protocol.VERSION) { if (this.getVer() < ConstValue.Protocol.VERSION) {
return ErrorCode.ERR_VERSION; return ErrorCode.ERR_VERSION;
} }
// 校验时间错
if (GlobalVar.IS_CHECK_REQUEST_TIMEOUT if (GlobalVar.IS_CHECK_REQUEST_TIMEOUT
&& System.currentTimeMillis() - this.getTimeStamp() >= ConstValue.Protocol.REQUEST_TIMEOUT_MS) { && Math.abs(System.currentTimeMillis() - this.getTimeStamp()) >= ConstValue.Protocol.REQUEST_TIMEOUT_MS) {
return ErrorCode.ERR_REQUESTTIMEOUT; return ErrorCode.ERR_REQUESTTIMEOUT;
} }

View File

@ -18,12 +18,15 @@ import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* The type Dispose node manager. * The type Dispose node manager.
*/ */
@Service @Service
@Slf4j
public class DisposeNodeManagerImpl implements DisposeNodeManager { public class DisposeNodeManagerImpl implements DisposeNodeManager {
/** /**
* The Dispose dev map. * The Dispose dev map.
@ -50,8 +53,10 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
*/ */
@Override @Override
public void loadDisposeNodeFromDB() { public void loadDisposeNodeFromDB() {
// 清理缓存中的所有内容
disposeDevMap.clear(); disposeDevMap.clear();
// 从数据库中加载所有设备
List<DisposeDevice> devList = disposeDeviceMapper.selectAll(); List<DisposeDevice> devList = disposeDeviceMapper.selectAll();
if (devList == null) { if (devList == null) {
@ -59,13 +64,17 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
} }
devList.forEach(v -> { devList.forEach(v -> {
// 对每个设备进行初始化
DisposeEntryManager dp = DeviceRouter.deviceRouterFactory(v.getType(), DisposeEntryManager dp = DeviceRouter.deviceRouterFactory(v.getType(),
v.getIpAddr(), v.getIpAddr(), IPAddrType.getIpAddrType(v.getIpAddr()));
IPAddrType.getIpAddrType(v.getIpAddr()));
// 链接状态
v.setLinkStatus(dp.getDeviceLinkStatus() ? 1 : 0); v.setLinkStatus(dp.getDeviceLinkStatus() ? 1 : 0);
// 版本信息
v.setVersion(dp.getVersion()); v.setVersion(dp.getVersion());
// 设备信息
v.setDevInfo(dp.getDeviceInfo()); v.setDevInfo(dp.getDeviceInfo());
// 设备能力信息
v.setDevCaps(dp.getDeviceCapacity()); v.setDevCaps(dp.getDeviceCapacity());
disposeDevMap.put(v.getIpAddr(), v); disposeDevMap.put(v.getIpAddr(), v);
@ -97,17 +106,20 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
*/ */
@Override @Override
public ErrorCode delDisposeDeviceByIp(String ipAddr) { public ErrorCode delDisposeDeviceByIp(String ipAddr) {
// 判断该IP是否存在
if (disposeDeviceMapper.isDeviceExistsByIp(ipAddr) == 0 if (disposeDeviceMapper.isDeviceExistsByIp(ipAddr) == 0
|| !disposeDevMap.containsKey(ipAddr)) { || !disposeDevMap.containsKey(ipAddr)) {
return ErrorCode.ERR_NOSUCHDEVICE; return ErrorCode.ERR_NOSUCHDEVICE;
} }
// 缓存中取出设备
DisposeDevice dev = disposeDevMap.get(ipAddr); DisposeDevice dev = disposeDevMap.get(ipAddr);
if (dev == null) { if (dev == null) {
return ErrorCode.ERR_NOSUCHDEVICE; return ErrorCode.ERR_NOSUCHDEVICE;
} }
// 删除数据库和缓存中内容
disposeDeviceMapper.delDisposeDeviceByIp(ipAddr); disposeDeviceMapper.delDisposeDeviceByIp(ipAddr);
disposeDevMap.remove(ipAddr); disposeDevMap.remove(ipAddr);
@ -125,9 +137,11 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
DisposeEntryManager dp; DisposeEntryManager dp;
try { try {
// 获取处置设备硬件访问接口
dp = DeviceRouter.deviceRouterFactory(dev.getType(), dp = DeviceRouter.deviceRouterFactory(dev.getType(),
dev.getIpAddr(), IPAddrType.getIpAddrType(dev.getIpAddr())); dev.getIpAddr(), IPAddrType.getIpAddrType(dev.getIpAddr()));
// 判断设备是否在线
if (!dp.getDeviceLinkStatus()) { if (!dp.getDeviceLinkStatus()) {
return new MReturnType<>(ErrorCode.ERR_NOSUCHDEVICE, String.valueOf(-1)); return new MReturnType<>(ErrorCode.ERR_NOSUCHDEVICE, String.valueOf(-1));
} }
@ -135,26 +149,29 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
return new MReturnType<>(ErrorCode.ERR_NOSUCHDEVICE, String.valueOf(-1)); return new MReturnType<>(ErrorCode.ERR_NOSUCHDEVICE, String.valueOf(-1));
} }
// 从缓存中获取设备信息
DisposeDevice dbDev = disposeDeviceMapper.getDeviceByIp(dev.getIpAddr()); DisposeDevice dbDev = disposeDeviceMapper.getDeviceByIp(dev.getIpAddr());
// 设备已经存在
if (dbDev != null) { if (dbDev != null) {
return new MReturnType<>(ErrorCode.ERR_DEVICEEXISTS, String.valueOf(dbDev.getId())); return new MReturnType<>(ErrorCode.ERR_DEVICEEXISTS, String.valueOf(dbDev.getId()));
} }
if (!dp.getDeviceLinkStatus()) { // 获取设备能力
return new MReturnType<>(ErrorCode.ERR_NOSUCHDEVICE, String.valueOf(-1));
}
if (dev.getDevCaps() == null) { if (dev.getDevCaps() == null) {
// 更新能力
dev.setDevCaps(dp.getDeviceCapacity()); dev.setDevCaps(dp.getDeviceCapacity());
} else { } else {
// 添加能力
dev.getDevCaps().addAll(dp.getDeviceCapacity()); dev.getDevCaps().addAll(dp.getDeviceCapacity());
} }
dev.setDevInfo(dp.getDeviceInfo()); dev.setDevInfo(dp.getDeviceInfo());
// 保存设备信息到数据库中
disposeDeviceMapper.addNewDisposeDevice(dev); disposeDeviceMapper.addNewDisposeDevice(dev);
// 保存设备信息到缓存中
disposeDevMap.put(dev.getIpAddr(), dev); disposeDevMap.put(dev.getIpAddr(), dev);
return new MReturnType<>(ErrorCode.ERR_OK, dev.getId().toString()); return new MReturnType<>(ErrorCode.ERR_OK, dev.getId().toString());
} }
@ -195,34 +212,6 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
return findRet.orElse(null); return findRet.orElse(null);
} }
// /**
// * Is dispose device exists boolean.
// *
// * @param ipAddr the ip addr
// * @return the boolean
// */
// private Boolean isDisposeDeviceExists(String ipAddr) {
// return disposeDevMap.containsKey(ipAddr);
// }
//
// /**
// * Add dispose device to cache.
// *
// * @param dev the dev
// */
// private void addDisposeDeviceToCache(DisposeDevice dev) {
// disposeDevMap.put(dev.getIpAddr(), dev);
// }
//
// private boolean devSupportCapacity(DisposeDevice dev, DeviceCapacity capacity) {
// List<DisposeDeviceCapacity> capList = dev.getDevCaps()
// .stream()
// .filter(f -> f.getCapacity() == capacity.getCode())
// .collect(Collectors.toList());
//
// return capList.size() > 0;
// }
/** /**
* Is ip in range boolean. * Is ip in range boolean.
* *
@ -262,16 +251,20 @@ public class DisposeNodeManagerImpl implements DisposeNodeManager {
@Override @Override
public DisposeDevice getDisposeDevice(String ipAddr, DeviceCapacity capacity) { public DisposeDevice getDisposeDevice(String ipAddr, DeviceCapacity capacity) {
for (DisposeDevice dev : disposeDevMap.values()) { for (DisposeDevice dev : disposeDevMap.values()) {
// 判断当前设备是否支持处置能力
List<DisposeDeviceCapacity> capList = dev.getDevCaps() List<DisposeDeviceCapacity> capList = dev.getDevCaps()
.stream() .stream()
.filter(f -> f.getCapacity() == capacity.getCode()) .filter(f -> f.getCapacity() == capacity.getCode())
.collect(Collectors.toList()); .collect(Collectors.toList());
// 设备是否支持处置该IP的
if(capList.stream().anyMatch(k -> isIpInRange(k, ipAddr))) { if(capList.stream().anyMatch(k -> isIpInRange(k, ipAddr))) {
log.info("{} with {} used device {}:{}", ipAddr, capacity.getReadme(), dev.getId(), dev.getIpAddr());
return dev; return dev;
} }
} }
log.error("No such device to process {} of {}", ipAddr, capacity.getReadme());
return null; return null;
} }
} }

View File

@ -115,7 +115,6 @@ public class TaskServiceImpl implements TaskService {
try { try {
log.error("load error:\n" + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(v)); log.error("load error:\n" + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(v));
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
e.printStackTrace();
log.error(e.getMessage()); log.error(e.getMessage());
} }
} }
@ -141,6 +140,7 @@ public class TaskServiceImpl implements TaskService {
} }
if (disposeDevice == null) { if (disposeDevice == null) {
log.error("No such device to dispose this task: devId:{}, disposeIp:{}, type:{}", task.getDeviceId(), task.getDisposeIp(), task.getType());
return MReturnType.<ErrorCode, Long>builder() return MReturnType.<ErrorCode, Long>builder()
.firstParam(ErrorCode.ERR_NOSUCHDEVICE) .firstParam(ErrorCode.ERR_NOSUCHDEVICE)
.secondParam(-1L) .secondParam(-1L)
@ -160,6 +160,7 @@ public class TaskServiceImpl implements TaskService {
.collect(Collectors.toList()); .collect(Collectors.toList());
if (taskList.size() > 0) { if (taskList.size() > 0) {
log.error("Same dispose task is running: devId:{}, disposeIp:{}, type:{}", task.getDeviceId(), task.getDisposeIp(), task.getType());
return MReturnType.<ErrorCode, Long>builder() return MReturnType.<ErrorCode, Long>builder()
.firstParam(ErrorCode.ERR_TASKRUNNING) .firstParam(ErrorCode.ERR_TASKRUNNING)
.secondParam(taskList.get(0).getId()) .secondParam(taskList.get(0).getId())
@ -175,10 +176,10 @@ public class TaskServiceImpl implements TaskService {
ErrorCode err = taskCacheManager.addTask(cacheTask); ErrorCode err = taskCacheManager.addTask(cacheTask);
return MReturnType.<ErrorCode, Long>builder() log.info("Create new dispose task is running: devId:{}, disposeIp:{}, type:{} result {}",
.firstParam(err) task.getDeviceId(), task.getDisposeIp(), task.getType(), err.getMsg());
.secondParam(task.getId())
.build(); return MReturnType.<ErrorCode, Long>builder().firstParam(err).secondParam(task.getId()).build();
} }
/** /**
@ -195,6 +196,7 @@ public class TaskServiceImpl implements TaskService {
TaskInfoDetail task = taskCacheManager.getTaskById(taskId); TaskInfoDetail task = taskCacheManager.getTaskById(taskId);
if (task == null) { if (task == null) {
log.error("No such task: taskId:{}", taskId);
return ErrorCode.ERR_NOSUCHDEVICE; return ErrorCode.ERR_NOSUCHDEVICE;
} }
@ -202,6 +204,7 @@ public class TaskServiceImpl implements TaskService {
DisposeEntryManager dp = getDisposeDeviceHandle(task.getDisposeIp(), task.getType()); DisposeEntryManager dp = getDisposeDeviceHandle(task.getDisposeIp(), task.getType());
if (dp == null) { if (dp == null) {
log.error("No such device to dispose this task: disposeId:{}, type:{}", task.getDisposeIp(), task.getType());
return ErrorCode.ERR_NOSUCHDEVICE; return ErrorCode.ERR_NOSUCHDEVICE;
} }
@ -214,7 +217,7 @@ public class TaskServiceImpl implements TaskService {
CompletableFuture.supplyAsync(() -> dp.runDispose(task.getDisposeIp(), DeviceCapacity.values()[task.getType()])) CompletableFuture.supplyAsync(() -> dp.runDispose(task.getDisposeIp(), DeviceCapacity.values()[task.getType()]))
.whenComplete((v, ex) -> { .whenComplete((v, ex) -> {
if (ex != null) { if (ex != null) {
log.error(ex.getMessage()); log.error("Start task: taskId:{}, error:{}", taskId, ex.getMessage());
// 执行任务失败恢复缓存中的任务状态 // 执行任务失败恢复缓存中的任务状态
taskCacheManager.upgradeTaskStatus(taskId, DisposeTaskStatus.TASK_NEW.getCode()); taskCacheManager.upgradeTaskStatus(taskId, DisposeTaskStatus.TASK_NEW.getCode());
} else { } else {
@ -225,6 +228,7 @@ public class TaskServiceImpl implements TaskService {
} else { } else {
// 任务执行完成后更新数据库处置任务状态 // 任务执行完成后更新数据库处置任务状态
disposeTaskMapper.changeTaskCurrentStatus(taskId, DisposeTaskStatus.TASK_RUNNING.getCode()); disposeTaskMapper.changeTaskCurrentStatus(taskId, DisposeTaskStatus.TASK_RUNNING.getCode());
log.info("Start task finished: taskId:{}, disposeId:{}, type:{}", taskId, task.getDisposeIp(), task.getType());
} }
} }
}); });
@ -248,6 +252,7 @@ public class TaskServiceImpl implements TaskService {
DisposeEntryManager dp = getDisposeDeviceHandle(task.getDisposeIp(), task.getType()); DisposeEntryManager dp = getDisposeDeviceHandle(task.getDisposeIp(), task.getType());
if (dp == null) { if (dp == null) {
log.error("No such device to dispose this task: disposeId:{}, type:{}", task.getDisposeIp(), task.getType());
return ErrorCode.ERR_NOSUCHDEVICE; return ErrorCode.ERR_NOSUCHDEVICE;
} }
@ -265,7 +270,7 @@ public class TaskServiceImpl implements TaskService {
if (ex != null) { if (ex != null) {
// 恢复缓存中任务状态到先前状态 // 恢复缓存中任务状态到先前状态
taskCacheManager.upgradeTaskStatus(taskId, prdStatus); taskCacheManager.upgradeTaskStatus(taskId, prdStatus);
log.error(ex.getMessage()); log.error("Stop task: taskId:{}, error:{}", taskId, ex.getMessage());
} else { } else {
if (v != ErrorCode.ERR_OK) { if (v != ErrorCode.ERR_OK) {
// 恢复缓存中任务状态到先前状态 // 恢复缓存中任务状态到先前状态
@ -274,10 +279,12 @@ public class TaskServiceImpl implements TaskService {
} else { } else {
// 任务执行完成后更新数据库处置任务状态 // 任务执行完成后更新数据库处置任务状态
finishTask(taskId); finishTask(taskId);
log.info("Stop task finished: taskId:{}, disposeId:{}, type:{}", taskId, task.getDisposeIp(), task.getType());
} }
} }
}); });
} else { } else {
log.error("No such task: taskId:{}", taskId);
return ErrorCode.ERR_NOSUCHTASK; return ErrorCode.ERR_NOSUCHTASK;
} }
@ -292,12 +299,16 @@ public class TaskServiceImpl implements TaskService {
*/ */
@Override @Override
public ErrorCode finishTask(Long taskId) { public ErrorCode finishTask(Long taskId) {
// 设置缓存任务状态为完成状态
ErrorCode err = taskCacheManager.upgradeTaskStatus(taskId, DisposeTaskStatus.TASK_FINISH.getCode()); ErrorCode err = taskCacheManager.upgradeTaskStatus(taskId, DisposeTaskStatus.TASK_FINISH.getCode());
if (err == ErrorCode.ERR_OK) { if (err == ErrorCode.ERR_OK) {
// 设置数据库任务状态为完成状态
disposeTaskMapper.changeTaskCurrentStatus(taskId, DisposeTaskStatus.TASK_FINISH.getCode()); disposeTaskMapper.changeTaskCurrentStatus(taskId, DisposeTaskStatus.TASK_FINISH.getCode());
// 移除缓存中的任务信息
taskCacheManager.removeTask(taskId); taskCacheManager.removeTask(taskId);
} }
return err; return err;
} }

View File

@ -2,7 +2,7 @@ package com.dispose.service.impl;
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.dispose.config.DisposeConfigure;
import com.dispose.manager.UserAccountCacheManager; import com.dispose.manager.UserAccountCacheManager;
import com.dispose.mapper.UserAccountMapper; import com.dispose.mapper.UserAccountMapper;
import com.dispose.pojo.entity.UserAccount; import com.dispose.pojo.entity.UserAccount;
@ -32,6 +32,12 @@ public class UserAccountServiceImpl implements UserAccountService {
@Resource @Resource
private UserAccountMapper userAccountMapper; private UserAccountMapper userAccountMapper;
/**
* The Dispose configure.
*/
@Resource
private DisposeConfigure disposeConfigure;
/** /**
* Auth token check error code. * Auth token check error code.
* *
@ -40,12 +46,12 @@ public class UserAccountServiceImpl implements UserAccountService {
*/ */
@Override @Override
public ErrorCode authTokenCheck(String token) { public ErrorCode authTokenCheck(String token) {
// 判断当前配置是否需要校验 token
if (GlobalVar.IS_VERIFY_TOKEN) { if ("false".equals(disposeConfigure.getCheckRequestToken())) {
return userAccountCacheManager.verifyToken(token); return ErrorCode.ERR_OK;
} }
return ErrorCode.ERR_OK; return userAccountCacheManager.verifyToken(token);
} }
/** /**
@ -61,19 +67,21 @@ public class UserAccountServiceImpl implements UserAccountService {
userAccountMapper.refreshLoginTime(username); userAccountMapper.refreshLoginTime(username);
UserAccount loginUser = userAccountMapper.getUserByName(username); UserAccount loginUser = userAccountMapper.getUserByName(username);
// 该用户是否存在
if (loginUser == null) { if (loginUser == null) {
return MReturnType.<ErrorCode, String>builder() log.error("User {} not exists", username);
.firstParam(ErrorCode.ERR_USERNOTFOUND) return MReturnType.<ErrorCode, String>builder().firstParam(ErrorCode.ERR_USERNOTFOUND).build();
.build();
} }
// 用户是否被锁定
if (loginUser.getStatus() == ConstValue.UserAccountStatus.LOCKED) { if (loginUser.getStatus() == ConstValue.UserAccountStatus.LOCKED) {
return MReturnType.<ErrorCode, String>builder() log.error("User {} is locked", username);
.firstParam(ErrorCode.ERR_USERLOCK) return MReturnType.<ErrorCode, String>builder().firstParam(ErrorCode.ERR_USERLOCK).build();
.build();
} }
// 用户密码错误
if (!loginUser.getPassword().equals(password)) { if (!loginUser.getPassword().equals(password)) {
log.error("User {} password [{}] error", username, password);
// 密码错误 // 密码错误
int errTimes = userAccountCacheManager.getUsrPwdErrTimes(username) + 1; int errTimes = userAccountCacheManager.getUsrPwdErrTimes(username) + 1;
@ -82,26 +90,19 @@ public class UserAccountServiceImpl implements UserAccountService {
if (errTimes == ConstValue.GlobalConfigure.ALLOW_PWD_ERR_TIMES - 1) { if (errTimes == ConstValue.GlobalConfigure.ALLOW_PWD_ERR_TIMES - 1) {
// 提示用户即将锁定账户 // 提示用户即将锁定账户
return MReturnType.<ErrorCode, String>builder() return MReturnType.<ErrorCode, String>builder().firstParam(ErrorCode.ERR_PASSWORDMORE).build();
.firstParam(ErrorCode.ERR_PASSWORDMORE)
.build();
} else if (errTimes >= ConstValue.GlobalConfigure.ALLOW_PWD_ERR_TIMES) { } else if (errTimes >= ConstValue.GlobalConfigure.ALLOW_PWD_ERR_TIMES) {
// 锁定账户 // 锁定账户
userAccountMapper.lockUserAccount(username); userAccountMapper.lockUserAccount(username);
return MReturnType.<ErrorCode, String>builder() return MReturnType.<ErrorCode, String>builder().firstParam(ErrorCode.ERR_USERLOCK).build();
.firstParam(ErrorCode.ERR_USERLOCK)
.build();
} else { } else {
return MReturnType.<ErrorCode, String>builder() return MReturnType.<ErrorCode, String>builder().firstParam(ErrorCode.ERR_PASSWORD).build();
.firstParam(ErrorCode.ERR_PASSWORD)
.build();
} }
} }
return MReturnType.<ErrorCode, String>builder() return MReturnType.<ErrorCode, String>builder()
.firstParam(ErrorCode.ERR_OK) .firstParam(ErrorCode.ERR_OK)
.secondParam(userAccountCacheManager.getUserToken(username)) .secondParam(userAccountCacheManager.getUserToken(username)).build();
.build();
} }
/** /**
@ -119,6 +120,7 @@ public class UserAccountServiceImpl implements UserAccountService {
return ErrorCode.ERR_USERNOTFOUND; return ErrorCode.ERR_USERNOTFOUND;
} }
// 注销
ErrorCode err = userAccountCacheManager.verifyUserLogin(username, token); ErrorCode err = userAccountCacheManager.verifyUserLogin(username, token);
if (err == ErrorCode.ERR_OK) { if (err == ErrorCode.ERR_OK) {
@ -139,7 +141,7 @@ public class UserAccountServiceImpl implements UserAccountService {
String username = userAccountCacheManager.getUsernameByToken(token); String username = userAccountCacheManager.getUsernameByToken(token);
if (username != null) { if (username != null && username.length() > 0) {
return userAccountMapper.getUserByName(username); return userAccountMapper.getUserByName(username);
} }

View File

@ -34,9 +34,11 @@ public class DeviceManagerTask {
DisposeEntryManager dp = DeviceRouter.deviceRouterFactory(v.getType(), DisposeEntryManager dp = DeviceRouter.deviceRouterFactory(v.getType(),
v.getIpAddr(), v.getIpAddr(),
IPAddrType.getIpAddrType(v.getIpAddr())); IPAddrType.getIpAddrType(v.getIpAddr()));
// 自动更新设备心跳状态
v.setLinkStatus(dp.getDeviceLinkStatus() ? 1 : 0); v.setLinkStatus(dp.getDeviceLinkStatus() ? 1 : 0);
// 自动读取设备系统版本信息
v.setVersion(dp.getVersion()); v.setVersion(dp.getVersion());
// 自动更新系统信息
v.setDevInfo(dp.getDeviceInfo()); v.setDevInfo(dp.getDeviceInfo());
}); });
} }

View File

@ -35,20 +35,24 @@ public class TaskManagerTask {
* Task runtime manager. * Task runtime manager.
*/ */
@Async("bizExecutor") @Async("bizExecutor")
@Scheduled(fixedDelay = 500) @Scheduled(fixedDelay = 1000)
public void taskRuntimeManager() { public void taskRuntimeManager() {
Iterator it = taskCacheManager.getAllTask().iterator(); Iterator<TaskInfoDetail> it = taskCacheManager.getAllTask().iterator();
// 由于可能删除列表中的项目所以使用迭代器
while (it.hasNext()) { while (it.hasNext()) {
TaskInfoDetail taskData = (TaskInfoDetail) it.next(); TaskInfoDetail taskData = it.next();
// 判断是否存在正在运行的过期的任务如果存在则结束该任务
if(taskService.taskIsExpired(taskData) && taskService.taskIsRunning(taskData)) { if(taskService.taskIsExpired(taskData) && taskService.taskIsRunning(taskData)) {
log.info("Finish expired task {}:{} begin at {}", log.info("Finish expired task {}:{} begin at {}",
taskData.getId(), taskData.getDisposeIp(), taskData.getBeginTime()); taskData.getId(), taskData.getDisposeIp(), taskData.getBeginTime());
taskService.stopTask(taskData.getId()); taskService.stopTask(taskData.getId());
it.remove();
continue; continue;
} }
// 判断是否有新建任务如果有的话启动新建的处置任务
if (taskData.getCurrentStatus() == DisposeTaskStatus.TASK_NEW.getCode()) { if (taskData.getCurrentStatus() == DisposeTaskStatus.TASK_NEW.getCode()) {
log.info("Start task {}:{} of {}", log.info("Start task {}:{} of {}",
taskData.getId(), taskData.getDisposeIp(), taskData.getBeginTime()); taskData.getId(), taskData.getDisposeIp(), taskData.getBeginTime());

View File

@ -53,7 +53,6 @@ public class InitTestEnvironment {
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; GlobalVar.IS_CHECK_REQUEST_TIMEOUT = true;
GlobalVar.IS_VERIFY_TOKEN = true;
log.warn("Current Used Virtual Dispose Device"); log.warn("Current Used Virtual Dispose Device");
} }
@ -91,11 +90,11 @@ public class InitTestEnvironment {
ErrorCode err = ErrorCode.ERR_OK; ErrorCode err = ErrorCode.ERR_OK;
JSONObject jsonObject = new JSONObject(data); JSONObject jsonObject = new JSONObject(data);
Iterator it = jsonObject.keys(); Iterator<String> it = jsonObject.keys();
System.out.println(); System.out.println();
while (it.hasNext()) { while (it.hasNext()) {
// 获得key // 获得key
String key = (String) it.next(); String key = it.next();
String value = jsonObject.getString(key); String value = jsonObject.getString(key);
System.out.println("key: " + key + ",value:" + value); System.out.println("key: " + key + ",value:" + value);
} }