fix:引擎申请设备超时后因根据设备id释放设备引起正在执行任务的设备失去使用权。
修改方案: 1.请求方申请设备时自带token值,设备管理服务判断设备是否空闲,如果空闲,那么请求方提供的token作为本次申请的token; 2.如果在申请过程中出现问题,请求方依然可以根据token释放设备,设备管理服务接收到改token的释放也会检查token是否有效 设备管理 1.增加接口:批量申请设备使用时,使用请求方提供的token 执行引擎 1.更改设备申请接口 2.修改移动和PC的设备申请逻辑,将两者相同逻辑部分进行抽取,简化代码 3.配置文件增加配置,亦可以不修改,接口地址有默认值。hz_1122_temp
parent
e6b4fe6d88
commit
5a5bef44c2
|
@ -143,4 +143,10 @@ public class AtuServerConfig {
|
|||
private String remoteProtocol;
|
||||
|
||||
private Boolean IsPcExecutor;
|
||||
|
||||
private String acquireDeviceWithTokenUrl;
|
||||
|
||||
public String getAcquireDeviceWithTokenUrl() {
|
||||
return StringUtils.isBlank(this.acquireDeviceWithTokenUrl) ? "/api/cctp-device-mgr/pub/deviceList/apply/batchWithToken" : this.acquireDeviceWithTokenUrl;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package net.northking.cctp.se.device.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@ApiModel(value = "设备申请")
|
||||
@ToString
|
||||
public class ApplyDeviceDto {
|
||||
|
||||
@ApiModelProperty(value = "设备Id")
|
||||
private String id;
|
||||
|
||||
@ApiModelProperty(value = "设备类型", notes = "1-pc,2-移动")
|
||||
private String type;
|
||||
|
||||
@ApiModelProperty(value = "token", notes = "可由请求方带上")
|
||||
private String token;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package net.northking.cctp.se.device.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@ApiModel(value = "设备批量申请dto")
|
||||
@ToString
|
||||
public class BatchApplyDeviceDto {
|
||||
|
||||
|
||||
@ApiModelProperty(value = "申请人id")
|
||||
private String id;
|
||||
|
||||
@ApiModelProperty(value = "使用来源,engine为引擎使用0")
|
||||
private String userBy;
|
||||
|
||||
@ApiModelProperty(value = "设备列表")
|
||||
private List<ApplyDeviceDto> deviceList;
|
||||
|
||||
}
|
|
@ -8,6 +8,8 @@ import com.rabbitmq.client.GetResponse;
|
|||
import net.northking.cctp.common.http.ResultWrapper;
|
||||
import net.northking.cctp.element.core.exception.ExecuteException;
|
||||
import net.northking.cctp.se.config.AtuServerConfig;
|
||||
import net.northking.cctp.se.device.dto.ApplyDeviceDto;
|
||||
import net.northking.cctp.se.device.dto.BatchApplyDeviceDto;
|
||||
import net.northking.cctp.se.dto.ScriptEngineInfo;
|
||||
import net.northking.cctp.se.exec.constant.AtuExecConstant;
|
||||
import net.northking.cctp.se.lifecycle.EngineRuntime;
|
||||
|
@ -24,11 +26,12 @@ import org.springframework.amqp.core.Message;
|
|||
import org.springframework.amqp.rabbit.core.RabbitAdmin;
|
||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.DigestUtils;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import java.util.*;
|
||||
|
@ -98,42 +101,10 @@ public class AtuPlanTaskSchedule {
|
|||
//获取引擎注册后的设备id
|
||||
EngineRuntime engineRuntime = EngineRuntime.getRuntime();
|
||||
ScriptEngineInfo info = engineRuntime.getEngineInfo();
|
||||
Map<String,Object> paramMap = new HashMap<>();
|
||||
paramMap.put("id",info.getEngineId());
|
||||
List<String> tryAcqurieDeviceIdList = Collections.singletonList(taskDeviceId);
|
||||
paramMap.put("deviceList",tryAcqurieDeviceIdList);
|
||||
paramMap.put("type","1");
|
||||
paramMap.put("userBy","engine");
|
||||
String url = atuServerConfig.getServerUrl() + atuServerConfig.getTryAcqurieDeviceUrl();
|
||||
try {
|
||||
ResponseEntity<ResultWrapper> result = restTemplate.postForEntity(url, paramMap, ResultWrapper.class);
|
||||
if(HttpStatus.OK.equals(result.getStatusCode())){
|
||||
ResultWrapper deviceResult = result.getBody();
|
||||
if (deviceResult != null && deviceResult.isSuccess()) {
|
||||
List<Map<String,String>> body = (List<Map<String,String>>)deviceResult.getData();
|
||||
if(!CollectionUtils.isEmpty(body)){
|
||||
logger.debug("移动任务请求占用成功移动端设备信息:"+JSON.toJSONString(body));
|
||||
for (int i = 0; i < body.size(); i++) {
|
||||
Map<String, String> deviceMap = body.get(i);
|
||||
String deviceId = deviceMap.get("id");
|
||||
String deviceToken = deviceMap.get("token");
|
||||
//获取设备对应的一条计划信息
|
||||
boolean isUsed = getTaskFromQueue(deviceId, deviceToken,TYPE_MOBILE);
|
||||
if(!isUsed){
|
||||
//无任务 释放设备
|
||||
logger.debug("无任务释放移动端设备:"+deviceId);
|
||||
releaseDevice(deviceToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
List<String> deviceList = Collections.singletonList(taskDeviceId); // 需要申请的设备集合
|
||||
|
||||
}
|
||||
}catch (Exception e){
|
||||
logger.error("请求占用设备失败,原因:",e);
|
||||
//释放所有设备
|
||||
releaseDevices(e, info.getEngineId(), tryAcqurieDeviceIdList);
|
||||
}
|
||||
List<ApplyDeviceDto> resultList = acquireDevice(deviceList, TYPE_MOBILE, info.getEngineId());
|
||||
useDeviceGetTask(resultList, TYPE_MOBILE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -152,74 +123,88 @@ public class AtuPlanTaskSchedule {
|
|||
if(!CollectionUtils.isEmpty(batchList)){
|
||||
logger.debug("存在PC类型的委托任务共{}条", batchList.size());
|
||||
if(batchList.size()>0){
|
||||
Map<String,Object> paramMap = new HashMap<>();
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(deviceId);
|
||||
paramMap.put("id",engineId);
|
||||
paramMap.put("deviceList",list);
|
||||
paramMap.put("type","2");
|
||||
paramMap.put("userBy","engine");
|
||||
//判断设备是否空闲
|
||||
String url = atuServerConfig.getServerUrl() + atuServerConfig.getTryAcqurieDeviceUrl();
|
||||
|
||||
List<ApplyDeviceDto> resultList = acquireDevice(list, TYPE_PC, engineId);
|
||||
useDeviceGetTask(resultList, TYPE_PC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void useDeviceGetTask(List<ApplyDeviceDto> deviceList, String type) {
|
||||
if (!deviceList.isEmpty()) {
|
||||
for (ApplyDeviceDto device : deviceList) {
|
||||
boolean isUsed = false;
|
||||
try {
|
||||
ResponseEntity<ResultWrapper> resultEntity = restTemplate.postForEntity(url, paramMap, ResultWrapper.class);
|
||||
logger.debug("pc任务请求设备使用结果:"+ JSON.toJSONString(resultEntity));
|
||||
if (HttpStatus.OK.equals(resultEntity.getStatusCode())) {
|
||||
ResultWrapper deviceResult = resultEntity.getBody();
|
||||
if (deviceResult!= null && deviceResult.isSuccess()) {
|
||||
List<Map<String, String>> body = (List<Map<String, String>>) deviceResult.getData();
|
||||
if (!CollectionUtils.isEmpty(body)) {
|
||||
Map<String, String> deviceMap = body.get(0);
|
||||
String deviceToken = deviceMap.get("token");
|
||||
logger.debug("设备token:" + deviceToken);
|
||||
logger.debug("当前设备{}占用成功。", deviceId);
|
||||
boolean isUsed = getTaskFromQueue(deviceId, deviceToken, TYPE_PC);
|
||||
if (!isUsed) {
|
||||
//设备无任务可领
|
||||
logger.debug("无任务释放PC设备:" + deviceId);
|
||||
releaseDevice(deviceToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
logger.debug("设备{}占用成功,token:{}", device.getId(), device.getToken());
|
||||
isUsed = getTaskFromQueue(device.getId(), device.getToken(), type);
|
||||
if (!isUsed) {
|
||||
// 设备无任务可领
|
||||
logger.debug("无任务释放设备:{}", device.getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("设备请求占用异常:",e);
|
||||
releaseDevices(e, info.getEngineId(), list);
|
||||
logger.error("从队列获取任务失败,准备释放设备{}", device.getId(), e);
|
||||
} finally {
|
||||
if (!isUsed) {
|
||||
releaseDevice(device.getToken());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void releaseDevices(Exception e, String engineId, List<String> deviceIds) {
|
||||
//释放所有设备
|
||||
String errorMsg = e.getMessage();
|
||||
if (errorMsg.contains("Read timed out")) {
|
||||
int count = 0;
|
||||
Map<String, Object> requestMap = new HashMap<>();
|
||||
requestMap.put("id", engineId);
|
||||
requestMap.put("deviceList", deviceIds);
|
||||
while (count++ < 50) {
|
||||
try {
|
||||
logger.debug("pc任务请求占用设备超时处理====");
|
||||
//请求超时释放请求设备
|
||||
String urlRelease = atuServerConfig.getServerUrl() + atuServerConfig.getReleaseDeviceBatch();
|
||||
ResponseEntity<ResultWrapper> entity = restTemplate.postForEntity(urlRelease, requestMap, ResultWrapper.class);
|
||||
if (HttpStatus.OK == entity.getStatusCode()) {
|
||||
count += 50;
|
||||
}
|
||||
Thread.sleep(2000);
|
||||
} catch (Exception innerE) {
|
||||
// todo: 增加发送队列
|
||||
logger.error("超时释放设备失败:", innerE);
|
||||
logger.debug("使用队列方式释放使用的设备:{}", requestMap);
|
||||
try {
|
||||
rabbitTemplate.convertAndSend(AtuExecConstant.ENGINE_RELEASE_ID, new Message(om.writeValueAsBytes(requestMap)));
|
||||
count += 50;
|
||||
} catch (JsonProcessingException jpe) {
|
||||
logger.error("释放设备失败", jpe);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param deviceList 需要申请的设备集合
|
||||
* @param type 1-pc 2-移动
|
||||
* @param engineId 引擎id
|
||||
* @return
|
||||
*/
|
||||
private List<ApplyDeviceDto> acquireDevice(List<String> deviceList, String type, String engineId) {
|
||||
if (deviceList.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
BatchApplyDeviceDto queryDto = new BatchApplyDeviceDto();
|
||||
queryDto.setId(engineId);
|
||||
queryDto.setUserBy("engine");
|
||||
List<ApplyDeviceDto> queryDeviceList = new ArrayList<>();
|
||||
queryDto.setDeviceList(queryDeviceList);
|
||||
for (String deviceId : deviceList) {
|
||||
ApplyDeviceDto dto = new ApplyDeviceDto();
|
||||
dto.setId(deviceId);
|
||||
dto.setType(type);
|
||||
dto.setToken(DigestUtils.md5DigestAsHex(String.format("%s@%s@%s", deviceId, engineId, System.currentTimeMillis()).getBytes()));
|
||||
queryDeviceList.add(dto);
|
||||
}
|
||||
try {
|
||||
String url = atuServerConfig.getServerUrl() + atuServerConfig.getAcquireDeviceWithTokenUrl();
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
HttpEntity<BatchApplyDeviceDto> requestEntity = new HttpEntity<>(queryDto, headers);
|
||||
ResponseEntity<ResultWrapper<List<ApplyDeviceDto>>> resultEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, new ParameterizedTypeReference<ResultWrapper<List<ApplyDeviceDto>>>(){});
|
||||
logger.debug("{} 任务请求设备使用是结果:{}", TYPE_MOBILE.equals(type) ? "移动" : "PC", JSON.toJSONString(resultEntity));
|
||||
if (resultEntity.getStatusCode().is2xxSuccessful()) {
|
||||
ResultWrapper<List<ApplyDeviceDto>> deviceResult = resultEntity.getBody();
|
||||
if (deviceResult != null && deviceResult.isSuccess() && deviceResult.getData() != null && !deviceResult.getData().isEmpty()) {
|
||||
return deviceResult.getData();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("设备请求占用异常", e);
|
||||
releaseDeviceAsException(queryDeviceList);
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 由于token是引擎自行创建,如果出现申请出错的时候,也可以使用该token释放,设备管理会自行判断该token是否有效
|
||||
* @param queryDeviceList 申请的设备集合
|
||||
*/
|
||||
private void releaseDeviceAsException(List<ApplyDeviceDto> queryDeviceList) {
|
||||
for (ApplyDeviceDto dto : queryDeviceList) {
|
||||
releaseDevice(dto.getToken());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -45,6 +45,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -45,6 +45,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -46,6 +46,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -46,6 +46,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -46,6 +46,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -44,6 +44,7 @@ atu:
|
|||
projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId}
|
||||
testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl
|
||||
busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName
|
||||
acquireDeviceWithTokenUrl: /api/cctp-device-mgr/pub/deviceList/apply/batchWithToken
|
||||
engine:
|
||||
executor-pool:
|
||||
pcSize: 1
|
||||
|
|
|
@ -4,10 +4,7 @@ import net.northking.cctp.common.db.Pagination;
|
|||
import net.northking.cctp.common.http.QueryByPage;
|
||||
import net.northking.cctp.device.db.entity.CdDeviceToken;
|
||||
import net.northking.cctp.device.db.entity.CdDeviceUsageLog;
|
||||
import net.northking.cctp.device.dto.device.CdMobileDeviceExitDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceLockDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceLogDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceInfoDto;
|
||||
import net.northking.cctp.device.dto.device.*;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto;
|
||||
|
@ -62,4 +59,13 @@ public interface DeviceActivityApiService {
|
|||
* @param deviceTokens 设备token信息
|
||||
*/
|
||||
void release(List<CdDeviceToken> deviceTokens);
|
||||
|
||||
/**
|
||||
* 批量申请设备
|
||||
* @param devices
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
List<ApplyDeviceDto> deviceListApply(BatchApplyDeviceDto devices, HttpServletRequest request);
|
||||
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ package net.northking.cctp.device.api.activity.service;
|
|||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.github.pagehelper.page.PageMethod;
|
||||
import net.northking.cctp.common.cache.EntityNameCache;
|
||||
import net.northking.cctp.common.cache.EntityNameCatalog;
|
||||
import net.northking.cctp.common.db.Pagination;
|
||||
|
@ -15,10 +14,7 @@ import net.northking.cctp.device.constants.DeviceConstants;
|
|||
import net.northking.cctp.device.constants.DeviceError;
|
||||
import net.northking.cctp.device.db.entity.*;
|
||||
import net.northking.cctp.device.db.service.*;
|
||||
import net.northking.cctp.device.dto.device.CdMobileDeviceExitDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceInfoDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceLockDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceLogDto;
|
||||
import net.northking.cctp.device.dto.device.*;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto;
|
||||
|
@ -31,6 +27,7 @@ import org.springframework.data.redis.core.ZSetOperations;
|
|||
import org.springframework.integration.redis.util.RedisLockRegistry;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.DigestUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
|
@ -38,7 +35,6 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
@Service
|
||||
|
@ -690,6 +686,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService {
|
|||
}
|
||||
|
||||
public Map<String, String> applyMobDevice(String deviceId, String userId,HttpServletRequest request,String userBy) {
|
||||
return applyMobDevice(deviceId, userId, request, userBy, null);
|
||||
}
|
||||
|
||||
public Map<String, String> applyMobDevice(String deviceId, String userId,HttpServletRequest request,String userBy, String token) {
|
||||
//校验设备是否使用中 如果设备使用中 直接返回null
|
||||
CdDeviceStatus status = this.cdDeviceStatusService.findByPrimaryKey(deviceId);
|
||||
if (!status.getUsageStatus().equals(DeviceConstants.DEVICE_STATUS_ONLINE)) {
|
||||
|
@ -705,8 +705,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService {
|
|||
CdDeviceCtrl ctrl = this.cdDeviceCtrlService.findByPrimaryKey(device.getCtrlId());
|
||||
|
||||
Date date = new Date();
|
||||
String index = deviceId + DeviceConstants.STR_REGEX + ctrl.getId() + DeviceConstants.STR_REGEX + date;
|
||||
String token = DigestUtils.md5DigestAsHex(index.getBytes());
|
||||
if (StringUtils.hasText(token)) { // 如果传入token,那么使用传入token
|
||||
String index = deviceId + DeviceConstants.STR_REGEX + ctrl.getId() + DeviceConstants.STR_REGEX + date;
|
||||
token = DigestUtils.md5DigestAsHex(index.getBytes());
|
||||
}
|
||||
|
||||
//记录到设备令牌表
|
||||
CdDeviceToken cdDeviceToken = new CdDeviceToken();
|
||||
|
@ -748,6 +750,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService {
|
|||
}
|
||||
|
||||
public Map<String, String> applyPcDevice(String deviceId, String userId,HttpServletRequest request,String userBy) {
|
||||
return applyPcDevice(deviceId, userId, request, userBy, null);
|
||||
}
|
||||
|
||||
public Map<String, String> applyPcDevice(String deviceId, String userId,HttpServletRequest request,String userBy, String token) {
|
||||
CdDeviceStatus status = this.cdDeviceStatusService.findByPrimaryKey(deviceId);
|
||||
if (!status.getUsageStatus().equals(DeviceConstants.DEVICE_STATUS_ONLINE)) {
|
||||
return null;
|
||||
|
@ -760,8 +766,10 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService {
|
|||
List<CdEngineInfo> engineList = this.cdEngineInfoService.query(cdEngineInfo);
|
||||
//新增令牌
|
||||
Date date = new Date();
|
||||
String index = deviceId + DeviceConstants.STR_REGEX + engineList.get(0).getId() + DeviceConstants.STR_REGEX + date;
|
||||
String token = DigestUtils.md5DigestAsHex(index.getBytes());
|
||||
if (StringUtils.hasText(token)) {
|
||||
String index = deviceId + DeviceConstants.STR_REGEX + engineList.get(0).getId() + DeviceConstants.STR_REGEX + date;
|
||||
token = DigestUtils.md5DigestAsHex(index.getBytes());
|
||||
}
|
||||
//记录到设备令牌表
|
||||
CdDeviceToken cdDeviceToken = new CdDeviceToken();
|
||||
cdDeviceToken.setId(deviceId);
|
||||
|
@ -837,4 +845,52 @@ public class DeviceActivityApiServiceImpl implements DeviceActivityApiService {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量申请设备
|
||||
* type解释:引擎中1代表pc设备,2代表移动设备,注意
|
||||
*
|
||||
* @param devices
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<ApplyDeviceDto> deviceListApply(BatchApplyDeviceDto devices, HttpServletRequest request) {
|
||||
List<ApplyDeviceDto> resultList = new ArrayList<>();
|
||||
String userId = devices.getId();
|
||||
String userBy = devices.getUserBy();
|
||||
if (!CollectionUtils.isEmpty(devices.getDeviceList())) {
|
||||
List<ApplyDeviceDto> applyList = devices.getDeviceList();
|
||||
for (ApplyDeviceDto device : applyList) {
|
||||
ApplyDeviceDto result = new ApplyDeviceDto();
|
||||
Map<String, String> deviceTokenMap = null;
|
||||
String deviceId = device.getId();
|
||||
String lockKey = String.format("%s%s", DeviceConstants.ENGINE_DEVICE_TYPE_MOBILE.equals(device.getType()) ? DeviceConstants.LOCK_MOBILE : DeviceConstants.LOCK_PC, deviceId);
|
||||
Lock lock = redisLockRegistry.obtain(lockKey);
|
||||
try {
|
||||
if (lock.tryLock(5000, TimeUnit.MILLISECONDS)) {
|
||||
if (DeviceConstants.ENGINE_DEVICE_TYPE_MOBILE.equals(device.getType())) {
|
||||
deviceTokenMap = applyMobDevice(deviceId, userId, request, userBy, device.getToken());
|
||||
} else {
|
||||
deviceTokenMap = applyPcDevice(deviceId, userId, request, userBy, device.getToken());
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
logger.error("申请移动设备异常:",e);
|
||||
Thread.currentThread().interrupt();
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
if (deviceTokenMap != null) {
|
||||
result.setId(deviceTokenMap.get("id"));
|
||||
result.setToken(deviceTokenMap.get("token"));
|
||||
if (StringUtils.hasText(result.getToken())) {
|
||||
resultList.add(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return resultList;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ public class DeviceMQReceiver {
|
|||
private final static Logger logger = LoggerFactory.getLogger(DeviceMQReceiver.class);
|
||||
|
||||
@RabbitListener(queuesToDeclare = {@Queue(value = "execute.engine.release")})
|
||||
public void DeviceMQReceiver(Message message){
|
||||
public void releaseReceive(Message message){
|
||||
// 释放设备
|
||||
try{
|
||||
byte[] body = message.getBody();
|
||||
|
@ -73,21 +73,4 @@ public class DeviceMQReceiver {
|
|||
logger.error("释放设备异常",e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param message
|
||||
*/
|
||||
@RabbitListener(queuesToDeclare = {@Queue(value = "execute.engine.release.id")})
|
||||
public void releaseById(Message message){
|
||||
try{
|
||||
byte[] body = message.getBody();
|
||||
Map<String, Object> mqParam = om.readValue(body, new TypeReference<Map<String, Object>>() {
|
||||
});
|
||||
|
||||
activityService.releaseDeviceList(mqParam);
|
||||
}catch (Exception e){
|
||||
logger.error("释放设备异常",e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ public class DeviceConstants {
|
|||
*/
|
||||
public final static String LOCK_MOBILE = "lock:mobile:";
|
||||
|
||||
public final static String LOCK_PC = "lock:mobile:";
|
||||
public final static String LOCK_PC = "lock:pc:";
|
||||
|
||||
//安卓类型
|
||||
public final static String MOBILE_PLATFORM_ANDROID = "0";
|
||||
|
@ -202,4 +202,9 @@ public class DeviceConstants {
|
|||
public final static String WS_AMOUNT = "amount";
|
||||
|
||||
public static final String ENGINE_MOB_ACTIVE_THREAD_KEY = "engine:mobile:activeThread";
|
||||
|
||||
public final static String ENGINE_DEVICE_TYPE_PC = "1"; // 引擎使用的设备类型,PC
|
||||
|
||||
public final static String ENGINE_DEVICE_TYPE_MOBILE = "2"; // 引擎使用的设备类型,移动
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package net.northking.cctp.device.dto.device;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@ApiModel(value = "设备申请")
|
||||
@ToString
|
||||
public class ApplyDeviceDto {
|
||||
|
||||
@ApiModelProperty(value = "设备Id")
|
||||
private String id;
|
||||
|
||||
@ApiModelProperty(value = "设备类型", notes = "1-pc,2-移动")
|
||||
private String type;
|
||||
|
||||
@ApiModelProperty(value = "token", notes = "可由请求方带上")
|
||||
private String token;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package net.northking.cctp.device.dto.device;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@ApiModel(value = "设备批量申请dto")
|
||||
@ToString
|
||||
public class BatchApplyDeviceDto {
|
||||
|
||||
|
||||
@ApiModelProperty(value = "申请人id")
|
||||
private String id;
|
||||
|
||||
@ApiModelProperty(value = "使用来源,engine为引擎使用0")
|
||||
private String userBy;
|
||||
|
||||
@ApiModelProperty(value = "设备列表")
|
||||
private List<ApplyDeviceDto> deviceList;
|
||||
|
||||
}
|
|
@ -10,9 +10,7 @@ import net.northking.cctp.device.db.entity.CdDeviceStatus;
|
|||
import net.northking.cctp.device.db.entity.CdDeviceToken;
|
||||
import net.northking.cctp.device.db.service.CdDeviceStatusService;
|
||||
import net.northking.cctp.device.db.service.CdDeviceTokenService;
|
||||
import net.northking.cctp.device.dto.device.CdMobileDeviceExitDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceInfoDto;
|
||||
import net.northking.cctp.device.dto.device.DeviceLockDto;
|
||||
import net.northking.cctp.device.dto.device.*;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdDeviceRemoteDto;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdPcDeviceExitDto;
|
||||
import net.northking.cctp.device.dto.pcDevice.CdPcDeviceRemoteDto;
|
||||
|
@ -161,4 +159,13 @@ public class DevicePubCtrl {
|
|||
Map<String, List<String>> result = apiService.queryDeviceType(deviceIds);
|
||||
return wrapper.success(result);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "批量申请设备使用", notes = "token由请求方提供")
|
||||
@PostMapping(value = "/deviceList/apply/batchWithToken")
|
||||
public ResultWrapper<List<ApplyDeviceDto>> batchApplyWithToken(@RequestBody BatchApplyDeviceDto devices, HttpServletRequest request) {
|
||||
logger.debug("批量申请设备(pub),{}", devices);
|
||||
ResultWrapper<List<ApplyDeviceDto>> wrapper = new ResultWrapper<>();
|
||||
List<ApplyDeviceDto> resultList = apiService.deviceListApply(devices, request);
|
||||
return wrapper.success(resultList);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue