整合车辆列表
This commit is contained in:
parent
725c0be448
commit
7b436316f1
@ -8,6 +8,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class VehicleManagerCacheService {
|
public class VehicleManagerCacheService {
|
||||||
@ -102,6 +103,12 @@ public class VehicleManagerCacheService {
|
|||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<JsonNode> getVehicleDetailsSnapshot() {
|
||||||
|
return vehicleDetailsCache.values().stream()
|
||||||
|
.map(CacheEntry::getData)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class CacheEntry {
|
public static class CacheEntry {
|
||||||
private final JsonNode data;
|
private final JsonNode data;
|
||||||
|
|||||||
@ -1,13 +1,21 @@
|
|||||||
package com.qaup.collision.websocket.handler;
|
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.lang.NonNull;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.socket.*;
|
import org.springframework.web.socket.*;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -23,6 +31,15 @@ public class CollisionWebSocketHandler implements WebSocketHandler {
|
|||||||
|
|
||||||
// 存储所有连接的WebSocket会话
|
// 存储所有连接的WebSocket会话
|
||||||
private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
|
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
|
@Override
|
||||||
public void afterConnectionEstablished(@NonNull WebSocketSession session) throws Exception {
|
public void afterConnectionEstablished(@NonNull WebSocketSession session) throws Exception {
|
||||||
@ -56,6 +73,8 @@ public class CollisionWebSocketHandler implements WebSocketHandler {
|
|||||||
System.currentTimeMillis()
|
System.currentTimeMillis()
|
||||||
);
|
);
|
||||||
sendMessage(session, pongMessage);
|
sendMessage(session, pongMessage);
|
||||||
|
} else if (isVehicleListRequest(payload)) {
|
||||||
|
sendVehicleList(session);
|
||||||
} else if (payload.contains("subscribe")) {
|
} else if (payload.contains("subscribe")) {
|
||||||
// 订阅消息处理
|
// 订阅消息处理
|
||||||
String subscribeResponse = String.format(
|
String subscribeResponse = String.format(
|
||||||
@ -100,6 +119,51 @@ public class CollisionWebSocketHandler implements WebSocketHandler {
|
|||||||
return false;
|
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