下载优化

This commit is contained in:
xy
2024-09-18 20:07:29 +08:00
parent 0fed84b8e0
commit 06c8ce2e29
5 changed files with 209 additions and 92 deletions

View File

@@ -494,7 +494,7 @@ public class MqttMessageHandler {
switch (res.getType()){
case 4865:
//设置心跳时间,超时改为掉线
redisUtil.saveByKeyWithExpire("MQTT:" + nDid, Instant.now().toEpochMilli(),180L);
redisUtil.saveByKeyWithExpire("MQTT:" + nDid, Instant.now().toEpochMilli(),300L);
//有心跳,则将装置改成在线
//csEquipmentDeliveryService.updateRunStatusBynDid(nDid,AccessEnum.ONLINE.getCode());
//处理心跳

View File

@@ -77,7 +77,6 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
private UserFeignClient userFeignClient;
@Resource
private RedisUtil redisUtil;
private final Object lock = new Object();
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
@@ -151,6 +150,7 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
synchronized (lock) {
NoticeUserDto dto = sendOffLine(nDid);
sendEventToUser(dto);
addLogs(dto);
String clientName = "NJCN-" + nDid.substring(nDid.length() - 6);
ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(() -> {
System.out.println(nDid + "执行重连定时任务...");
@@ -172,6 +172,7 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
if (MAX_WARNING_TIMES == 30) {
NoticeUserDto dto2 = sendConnectFail(nDid);
sendEventToUser(dto2);
addLogs(dto2);
}
}
} else {
@@ -180,6 +181,7 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
if (MAX_WARNING_TIMES == 30) {
NoticeUserDto dto2 = sendConnectFail(nDid);
sendEventToUser(dto2);
addLogs(dto2);
}
logDto.setResult(0);
}
@@ -191,7 +193,7 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
//掉线通知
private NoticeUserDto sendOffLine(String nDid) {
NoticeUserDto dto = new NoticeUserDto();
NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
// NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
dto.setTitle("设备离线");
CsEquipmentDeliveryPO po = equipmentFeignClient.findDevByNDid(nDid).getData();
DevDetailDTO devDetailDto = csLedgerFeignclient.queryDevDetail(po.getId()).getData();
@@ -201,16 +203,16 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
String content = String.format(devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "" + dateStr + "离线");
dto.setContent(content);
dto.setPushClientId(getEventUser(po.getId(),true));
payload.setType(3);
payload.setPath("/pages/message/message?type="+payload.getType());
dto.setPayload(payload);
// payload.setType(3);
// payload.setPath("/pages/message/message?type="+payload.getType());
// dto.setPayload(payload);
return dto;
}
//重连失败通知
private NoticeUserDto sendConnectFail(String nDid) {
NoticeUserDto dto = new NoticeUserDto();
NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
// NoticeUserDto.Payload payload = new NoticeUserDto.Payload();
dto.setTitle("设备接入失败");
CsEquipmentDeliveryPO po = equipmentFeignClient.findDevByNDid(nDid).getData();
DevDetailDTO devDetailDto = csLedgerFeignclient.queryDevDetail(po.getId()).getData();
@@ -219,14 +221,20 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
String dateStr = localDateTime.format(fmt);
String content = String.format(devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "" + dateStr + "多次接入失败");
dto.setContent(content);
dto.setPushClientId(getEventUser(po.getId(),true));
payload.setType(3);
payload.setPath("/pages/message/message?type="+payload.getType());
dto.setPayload(payload);
dto.setPushClientId(getEventUser(po.getId(),false));
// payload.setType(3);
// payload.setPath("/pages/message/message?type="+payload.getType());
// dto.setPayload(payload);
return dto;
}
//日志记录
private void addLogs(NoticeUserDto noticeUserDto) {
DeviceLogDTO dto = new DeviceLogDTO();
dto.setUserName(noticeUserDto.getTitle());
dto.setOperate(noticeUserDto.getContent());
csLogsFeignClient.addUserLog(dto);
}
/**
* 获取所有需要推送的用户id

View File

@@ -9,10 +9,12 @@ import com.njcn.access.pojo.dto.ControlDto;
import com.njcn.access.pojo.dto.ReqAndResDto;
import com.njcn.access.pojo.dto.file.FileRedisDto;
import com.njcn.access.service.AskDeviceDataService;
import com.njcn.common.pojo.dto.DeviceLogDTO;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.enums.AlgorithmResponseEnum;
import com.njcn.redis.pojo.enums.AppRedisKey;
import com.njcn.redis.utils.RedisUtil;
import com.njcn.zlevent.pojo.dto.NoticeUserDto;
import lombok.RequiredArgsConstructor;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
@@ -20,6 +22,11 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.Objects;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author xy
@@ -80,35 +87,33 @@ public class AskDeviceDataServiceImpl implements AskDeviceDataService {
redisUtil.saveByKey(AppRedisKey.DEVICE_MID + nDid,mid);
}
@Override
public boolean downloadFile(String nDid, String name, Integer size, String fileCheck) {
boolean result = true;
redisUtil.saveByKeyWithExpire("fileDowning:"+nDid,"fileDowning",300L);
redisUtil.saveByKeyWithExpire("fileCheck"+name,fileCheck,300L);
int length = size/51200 + 1;
try {
for (int i = 0; i < length; i++) {
Object object = getDeviceMid(nDid);
if (!Objects.isNull(object)) {
mid = (Integer) object;
}
ReqAndResDto.Req reqAndResParam = getPojo(mid,name,i);
publisher.send("/Pfm/DevFileCmd/V1/"+nDid,new Gson().toJson(reqAndResParam),1,false);
//判断是否重发
sendNextStep(name,nDid,mid,i);
FileRedisDto fileRedisDto = (FileRedisDto) redisUtil.getObjectByKey(AppRedisKey.DOWNLOAD + name + mid);
//重发之后判断继续循环还是跳出循环
if (!Objects.isNull(fileRedisDto) && !Objects.equals(fileRedisDto.getCode(),200)) {
result = false;
break;
}
mid = mid + 1;
if (mid > 10000) {
mid = 1;
}
redisUtil.saveByKey(AppRedisKey.DEVICE_MID + nDid,mid);
redisUtil.saveByKeyWithExpire("fileDowning:"+nDid,"fileDowning",300L);
redisUtil.saveByKeyWithExpire("fileCheck"+name,fileCheck,300L);
Object object = getDeviceMid(nDid);
if (!Objects.isNull(object)) {
mid = (Integer) object;
}
ReqAndResDto.Req reqAndResParam = getAllPojo(mid,name);
publisher.send("/Pfm/DevFileCmd/V1/"+nDid,new Gson().toJson(reqAndResParam),1,false);
//这里使用简单的轮询,但建议考虑更高效的机制
for (int i = 0; i < 120; i++) {
Thread.sleep(2000);
Object object2 = redisUtil.getObjectByKey("downloadFilePath:"+name);
if (!Objects.isNull(object2)) {
break;
} else {
result = false;
}
}
mid = mid + 1;
if (mid > 10000) {
mid = 1;
}
redisUtil.saveByKey(AppRedisKey.DEVICE_MID + nDid,mid);
} catch (Exception e) {
redisUtil.delete("fileDowning:"+nDid);
redisUtil.delete("fileCheck"+name);
@@ -196,6 +201,25 @@ public class AskDeviceDataServiceImpl implements AskDeviceDataService {
return csTopicFeignClient.find(nDid).getData();
}
/**
* 全文件下载请求报文
*/
public ReqAndResDto.Req getAllPojo(Integer mid, String fileName) {
String json;
ReqAndResDto.Req reqAndResParam = new ReqAndResDto.Req();
reqAndResParam.setMid(mid);
reqAndResParam.setDid(0);
reqAndResParam.setPri(AccessEnum.FIRST_CHANNEL.getCode());
reqAndResParam.setType(Integer.parseInt(TypeEnum.TYPE_9.getCode()));
reqAndResParam.setExpire(-1);
json = "{Name:\""+fileName+"\",TransferMode:"+(-1)+",Offset:"+(-1)+",Len:"+range+"}";
JSONObject jsonObject = JSONObject.fromObject(json);
reqAndResParam.setMsg(jsonObject);
return reqAndResParam;
}
/**
* 文件下载请求报文
*/