磁盘数据表分表,适配磁盘数据名称存储表。
磁盘相关功能
This commit is contained in:
@@ -45,6 +45,8 @@ import java.util.stream.Collectors;
|
||||
public class MessageHandler {
|
||||
|
||||
private final Map<String, Consumer<DeviceMessage>> messageHandlers = new HashMap<>();
|
||||
// 硬盘上报状态
|
||||
String DISK_COUNT_PREFIX = "disk:count:";
|
||||
// 心跳状态
|
||||
private static final String HEARTBEAT_STATUS_PREFIX = "heartbeat:status:";
|
||||
// 心跳时间
|
||||
@@ -104,6 +106,8 @@ public class MessageHandler {
|
||||
private IRmFrpcConfigManageService rmFrpcConfigManageService;
|
||||
@Autowired
|
||||
private IRmPppoeConfigSubService rmPppoeConfigSubService;
|
||||
@Autowired
|
||||
private IAllDiskNameService allDiskNameService;
|
||||
|
||||
|
||||
/**
|
||||
@@ -128,6 +132,24 @@ public class MessageHandler {
|
||||
registerHandler(MsgEnum.多公网IP探测.getValue(), this::handleNetWorkDelectMessage);
|
||||
registerHandler(MsgEnum.修改frp配置文件应答.getValue(), this::handleUpdateFrpMessage);
|
||||
registerHandler(MsgEnum.macvlan状态上报.getValue(), this::handleMacvlanMessage);
|
||||
registerHandler(MsgEnum.iops结果上报.getValue(), this::handleIopsResultMessage);
|
||||
}
|
||||
|
||||
private void handleIopsResultMessage(DeviceMessage message) {
|
||||
List<DiskIopsResultVo> diskIopsResultVoList = JsonDataParser.parseJsonData(message.getData(), DiskIopsResultVo.class);
|
||||
if(diskIopsResultVoList != null && !diskIopsResultVoList.isEmpty()){
|
||||
DiskIopsResultVo diskIopsResultVo = diskIopsResultVoList.get(0);
|
||||
// 时间戳转换
|
||||
long timestamp = diskIopsResultVo.getTimestamp();
|
||||
long millis = timestamp * 1000;
|
||||
Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
|
||||
AllDiskName allDiskName = new AllDiskName();
|
||||
allDiskName.setClientId(message.getClientId());
|
||||
allDiskName.setName(diskIopsResultVo.getName());
|
||||
allDiskName.setReadIops(diskIopsResultVo.getReadIops());
|
||||
allDiskName.setWriteIops(diskIopsResultVo.getWriteIops());
|
||||
allDiskNameService.updateAllDiskName(allDiskName);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMacvlanMessage(DeviceMessage message) {
|
||||
@@ -540,20 +562,77 @@ public class MessageHandler {
|
||||
*/
|
||||
private void handleDiskMessage(DeviceMessage message) {
|
||||
List<InitialDiskInfo> disks = JsonDataParser.parseJsonData(message.getData(), InitialDiskInfo.class);
|
||||
// 时间戳转换
|
||||
long timestamp = disks.get(0).getTimestamp();
|
||||
long millis = timestamp * 1000;
|
||||
Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
|
||||
if(!disks.isEmpty()){
|
||||
disks.forEach(iface -> {
|
||||
iface.setClientId(message.getClientId());
|
||||
iface.setCreateTime(createTime);
|
||||
});
|
||||
// 初始磁盘数据入库
|
||||
initialDiskInfoService.batchInsertInitialDiskInfo(disks, createTime);
|
||||
}else{
|
||||
String clientId = message.getClientId();
|
||||
|
||||
if (disks == null || disks.isEmpty()) {
|
||||
throw new RuntimeException("磁盘data数据为空");
|
||||
}
|
||||
|
||||
long timestamp = disks.get(0).getTimestamp();
|
||||
long millis = timestamp * 1000;
|
||||
Date createTime = new Date(millis / 1000 * 1000);
|
||||
|
||||
// 关键:每个clientId有自己独立的key
|
||||
String diskCountKey = DISK_COUNT_PREFIX + clientId;
|
||||
|
||||
// 1. 给这个客户端的所有磁盘次数+1
|
||||
Map<Object, Object> diskCountMap = redisTemplate.opsForHash().entries(diskCountKey);
|
||||
for (Map.Entry<Object, Object> entry : diskCountMap.entrySet()) {
|
||||
String diskName = (String) entry.getKey();
|
||||
String countStr = (String) entry.getValue();
|
||||
|
||||
try {
|
||||
int count = Integer.parseInt(countStr) + 1;
|
||||
redisTemplate.opsForHash().put(diskCountKey, diskName, String.valueOf(count));
|
||||
} catch (NumberFormatException e) {
|
||||
redisTemplate.opsForHash().put(diskCountKey, diskName, "1");
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 处理本次上报的磁盘
|
||||
Set<String> reportedDisks = new HashSet<>();
|
||||
disks.forEach(disk -> {
|
||||
String diskName = disk.getName();
|
||||
reportedDisks.add(diskName);
|
||||
|
||||
// 本次上报的磁盘,次数重置为0
|
||||
redisTemplate.opsForHash().put(diskCountKey, diskName, "0");
|
||||
|
||||
disk.setClientId(clientId);
|
||||
disk.setCreateTime(createTime);
|
||||
});
|
||||
|
||||
// 3. 检查次数≥3的磁盘
|
||||
diskCountMap = redisTemplate.opsForHash().entries(diskCountKey);
|
||||
List<String> disksToRemove = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<Object, Object> entry : diskCountMap.entrySet()) {
|
||||
String diskName = (String) entry.getKey();
|
||||
String countStr = (String) entry.getValue();
|
||||
|
||||
try {
|
||||
int count = Integer.parseInt(countStr);
|
||||
// 如果次数≥3且本次没上报
|
||||
if (count >= 3 && !reportedDisks.contains(diskName)) {
|
||||
AllDiskName allDiskName = new AllDiskName();
|
||||
allDiskName.setStatus(0);
|
||||
allDiskName.setClientId(clientId);
|
||||
allDiskName.setName(diskName);
|
||||
allDiskNameService.updateAllDiskName(allDiskName);
|
||||
disksToRemove.add(diskName);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
disksToRemove.add(diskName);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 删除已处理的磁盘记录
|
||||
if (!disksToRemove.isEmpty()) {
|
||||
redisTemplate.opsForHash().delete(diskCountKey, disksToRemove.toArray());
|
||||
}
|
||||
|
||||
// 5. 数据入库
|
||||
initialDiskInfoService.batchInsertInitialDiskInfo(disks, createTime);
|
||||
}
|
||||
/**
|
||||
* 内存数据入库
|
||||
|
||||
Reference in New Issue
Block a user