From 7b436316f129ff91b21392f49055628a7af04170 Mon Sep 17 00:00:00 2001 From: sladro Date: Thu, 22 Jan 2026 13:33:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E5=90=88=E8=BD=A6=E8=BE=86=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/VehicleManagerCacheService.java | 7 ++ .../handler/CollisionWebSocketHandler.java | 72 +++++++++++++++++-- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/qaup-collision/src/main/java/com/qaup/collision/datacollector/service/VehicleManagerCacheService.java b/qaup-collision/src/main/java/com/qaup/collision/datacollector/service/VehicleManagerCacheService.java index 9d3ce1a..ceaa75d 100644 --- a/qaup-collision/src/main/java/com/qaup/collision/datacollector/service/VehicleManagerCacheService.java +++ b/qaup-collision/src/main/java/com/qaup/collision/datacollector/service/VehicleManagerCacheService.java @@ -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 getVehicleDetailsSnapshot() { + return vehicleDetailsCache.values().stream() + .map(CacheEntry::getData) + .collect(Collectors.toList()); + } + @Data public static class CacheEntry { private final JsonNode data; diff --git a/qaup-collision/src/main/java/com/qaup/collision/websocket/handler/CollisionWebSocketHandler.java b/qaup-collision/src/main/java/com/qaup/collision/websocket/handler/CollisionWebSocketHandler.java index 8a29fe9..802fe86 100644 --- a/qaup-collision/src/main/java/com/qaup/collision/websocket/handler/CollisionWebSocketHandler.java +++ b/qaup-collision/src/main/java/com/qaup/collision/websocket/handler/CollisionWebSocketHandler.java @@ -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 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 details = new ArrayList<>(vehicleManagerCacheService.getVehicleDetailsSnapshot()); + + if (details.isEmpty()) { + Set 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)); + } + /** * 发送消息给指定会话(线程安全)- 添加发送失败跳过机制 */