整合车辆列表

This commit is contained in:
sladro 2026-01-22 13:33:44 +08:00
parent 725c0be448
commit 7b436316f1
2 changed files with 75 additions and 4 deletions

View File

@ -8,6 +8,7 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.List;
@Service
public class VehicleManagerCacheService {
@ -102,6 +103,12 @@ public class VehicleManagerCacheService {
return ids;
}
public List<JsonNode> getVehicleDetailsSnapshot() {
return vehicleDetailsCache.values().stream()
.map(CacheEntry::getData)
.collect(Collectors.toList());
}
@Data
public static class CacheEntry {
private final JsonNode data;

View File

@ -1,13 +1,21 @@
package com.qaup.collision.websocket.handler;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.qaup.collision.datacollector.service.VehicleManagerCacheService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@ -23,6 +31,15 @@ public class CollisionWebSocketHandler implements WebSocketHandler {
// 存储所有连接的WebSocket会话
private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
private final ObjectMapper objectMapper;
private final VehicleManagerCacheService vehicleManagerCacheService;
public CollisionWebSocketHandler(@Qualifier("websocketObjectMapper") ObjectMapper objectMapper,
VehicleManagerCacheService vehicleManagerCacheService) {
this.objectMapper = objectMapper;
this.vehicleManagerCacheService = vehicleManagerCacheService;
}
@Override
public void afterConnectionEstablished(@NonNull WebSocketSession session) throws Exception {
@ -56,6 +73,8 @@ public class CollisionWebSocketHandler implements WebSocketHandler {
System.currentTimeMillis()
);
sendMessage(session, pongMessage);
} else if (isVehicleListRequest(payload)) {
sendVehicleList(session);
} else if (payload.contains("subscribe")) {
// 订阅消息处理
String subscribeResponse = String.format(
@ -100,6 +119,51 @@ public class CollisionWebSocketHandler implements WebSocketHandler {
return false;
}
private boolean isVehicleListRequest(String payload) {
if (payload == null || payload.isBlank()) {
return false;
}
if (payload.contains("vehicle_list") || payload.contains("vehicleList") || payload.contains("getVehicleList")) {
return true;
}
try {
JsonNode node = objectMapper.readTree(payload);
String type = node.has("type") ? node.get("type").asText() : null;
String action = node.has("action") ? node.get("action").asText() : null;
return "vehicle_list".equalsIgnoreCase(type)
|| "vehicle_list_request".equalsIgnoreCase(type)
|| "get_vehicle_list".equalsIgnoreCase(type)
|| "vehicleList".equalsIgnoreCase(type)
|| "vehicle_list".equalsIgnoreCase(action)
|| "getVehicleList".equalsIgnoreCase(action);
} catch (Exception e) {
return false;
}
}
private void sendVehicleList(WebSocketSession session) throws Exception {
List<JsonNode> details = new ArrayList<>(vehicleManagerCacheService.getVehicleDetailsSnapshot());
if (details.isEmpty()) {
Set<String> knownVehicleIds = vehicleManagerCacheService.getKnownVehicleIds();
for (String vehicleId : knownVehicleIds) {
ObjectNode node = objectMapper.createObjectNode();
node.put("vehicleId", vehicleId);
details.add(node);
}
}
ObjectNode response = objectMapper.createObjectNode();
response.put("type", "vehicle_list");
response.put("count", details.size());
response.put("timestamp", System.currentTimeMillis());
response.set("payload", objectMapper.valueToTree(details));
sendMessage(session, objectMapper.writeValueAsString(response));
}
/**
* 发送消息给指定会话线程安全- 添加发送失败跳过机制
*/