package com.moral.api.websocket; import lombok.Data; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import com.moral.api.entity.SpecialDevice; import com.moral.api.entity.UnitConversion; import com.moral.api.pojo.redisBean.SpecialDeviceInfoDTO; import com.moral.constant.RedisConstants; //走航车实时websocket @ServerEndpoint("/cruiserWebsocket/{mac}") @Component @Data public class CruiserWebSocketServer { //线程安全集合,用于存放server对象 public static CopyOnWriteArraySet sockets = new CopyOnWriteArraySet<>(); public static RedisTemplate redisTemplate; private Session session; private String mac; private SpecialDevice specialDevice; private Map regionAqi; private List unitConversions; @OnOpen public void onOpen(Session session, @PathParam("mac") String mac) { this.session = session; this.mac = mac; this.specialDevice = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, mac); try { //获取设备信息 SpecialDeviceInfoDTO deviceInfo = (SpecialDeviceInfoDTO) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE, mac); //获取与设备绑定的国控站guid, String guid = deviceInfo.getSpecialDevice().getGuid(); if (!ObjectUtils.isEmpty(guid)) { //获取国控aqi数据,用于补偿 this.regionAqi = (Map) redisTemplate.opsForHash().get(RedisConstants.AQI_DATA, guid); } } catch (Exception e) { e.printStackTrace(); } sockets.add(this); } @OnClose public void onClose() { sockets.remove(this); } @OnMessage public void onMessage(String message, Session session) { System.out.println("websocket==" + message); } @OnError public void onError(Session session, Throwable error) { } public void sendMessage(String message) throws Exception { if (this.session.isOpen()) { // synchronized (session) { this.session.getBasicRemote().sendText(message); // } } } }