整合车辆列表
This commit is contained in:
parent
725c0be448
commit
7b436316f1
@ -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;
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送消息给指定会话(线程安全)- 添加发送失败跳过机制
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user