xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MessageLocalConfig.java
@@ -1,13 +1,14 @@ package com.xiaopeng.pushMessage.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.boot.autoconfigure.context.MessageSourceProperties; import org.springframework.boot.autoconfigure.web.WebProperties; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.util.StringUtils; import org.springframework.web.servlet.LocaleResolver; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -59,4 +60,13 @@ // return new MyLocaleResolver(); // } @Bean ObjectMapper om() { // 允许对象忽略json中不存在的属性 ObjectMapper om = new ObjectMapper(); om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); om.registerModule(new JavaTimeModule()); return om; } } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
@@ -1,9 +1,7 @@ package com.xiaopeng.pushMessage.webSocket.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.vo.TaskVO; import com.xiaopeng.common.core.domain.R; @@ -15,7 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.PostConstruct; import java.util.List; import java.util.Map; import java.util.Set; @@ -34,15 +31,7 @@ @Autowired private WebSocketUserService webSocketUserService; private ObjectMapper om; @PostConstruct void setupObjectMapper() { // 允许对象忽略json中不存在的属性 om = new ObjectMapper(); om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); om.registerModule(new JavaTimeModule()); } @Autowired ObjectMapper om; // ==================== 基于XpAppUser的WebSocket接口 ==================== @@ -385,4 +374,5 @@ return R.ok(); } } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/BusinessMsgHandler.java
New file @@ -0,0 +1,9 @@ package com.xiaopeng.pushMessage.webSocket.handler; public interface BusinessMsgHandler{ String getMessageType(); void handle(String uid, String msg); } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/PositionMsgHandler.java
New file @@ -0,0 +1,50 @@ package com.xiaopeng.pushMessage.webSocket.handler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.xiaopeng.api.dto.account.XpOperationsUserPositionDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; @Component public class PositionMsgHandler implements BusinessMsgHandler{ @Override public String getMessageType() { return "position"; } @Override public void handle(String uid, String msg) { XpOperationsUserPositionDTO xpOperationsUserPositionDTO; try { xpOperationsUserPositionDTO = om.readValue(msg, XpOperationsUserPositionDTO.class); } catch (JsonProcessingException e) { throw new RuntimeException(e); } if (null != xpOperationsUserPositionDTO) { xpOperationsUserPositionDTO.setId(Long.parseLong(uid)); saveToMongo(xpOperationsUserPositionDTO); } } @Autowired ObjectMapper om; @Autowired MongoTemplate mongoTemplate; private void saveToMongo(XpOperationsUserPositionDTO dto) { XpOperationsUserPositionDTO vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("id").is(dto.getId())), XpOperationsUserPositionDTO.class); if (null == vehiclePosition) { mongoTemplate.save(dto); }else{ Update update = new Update() .set("id",dto.getId()) .set("latitude", dto.getLatitude()) .set("latitude", dto.getLongitude()); mongoTemplate.updateFirst(new Query(Criteria.where("id").is(dto.getId())), update, XpOperationsUserPositionDTO.class); } } } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java
@@ -13,8 +13,9 @@ import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.util.Objects; import java.util.UUID; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * TextWebSocketFrame 表示一个文本桢 @@ -32,6 +33,16 @@ @Autowired private WebSocketAuthHandler authHandler; Map<String, BusinessMsgHandler> businessMsgHandlers; public WebSocketTextFrameHandler(List<BusinessMsgHandler> handlers) { this.businessMsgHandlers = handlers.stream() .collect(Collectors.toMap( BusinessMsgHandler::getMessageType, Function.identity() )); } @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { @@ -143,6 +154,8 @@ if (appUserId != null) { log.info("收到用户 {} 的业务消息: {}", appUserId, messageObj.toJSONString()); businessMsgHandlers.get(messageObj.getString("type")).handle(appUserId, messageObj.getString("message")); // 回复消息 JSONObject response = new JSONObject(); response.put("type", "message_response");