yang_shj
11 months ago
6 changed files with 213 additions and 4 deletions
@ -0,0 +1,70 @@ |
|||||||
|
package com.hnac.hzims.alarm.ws.alart; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.alarm.show.service.AlarmService; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.ObjectUtil; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.socket.CloseStatus; |
||||||
|
import org.springframework.web.socket.TextMessage; |
||||||
|
import org.springframework.web.socket.WebSocketSession; |
||||||
|
import org.springframework.web.socket.handler.TextWebSocketHandler; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
public class AlarmHandler extends TextWebSocketHandler { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private AlarmService alarmService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void afterConnectionEstablished(WebSocketSession session) { |
||||||
|
String[] split = session.getUri().toString().split("/"); |
||||||
|
String uid = split[split.length - 1]; |
||||||
|
AlarmSessionManager.add(uid, session); |
||||||
|
session.getAttributes().put("userId", uid); |
||||||
|
log.info("sessionId: " + session.getId()); |
||||||
|
log.info("session connection successful!"); |
||||||
|
AlarmSocketPool.pool.put(session.getId(), this); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { |
||||||
|
AlarmSessionManager.removeAndClose(session.getId()); |
||||||
|
AlarmSocketPool.pool.remove(session.getId()); |
||||||
|
log.info("sessionId: " + session.getId()); |
||||||
|
log.info("uri: " + session.getUri()); |
||||||
|
log.info("session closed successful!"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handleTransportError(WebSocketSession session, Throwable exception) { |
||||||
|
AlarmSessionManager.removeAndClose(session.getId()); |
||||||
|
AlarmSocketPool.pool.remove(session.getId()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws IOException { |
||||||
|
String userId = (String) session.getAttributes().get("userId"); |
||||||
|
String message = textMessage.getPayload(); |
||||||
|
if(StringUtil.isBlank(message)){ |
||||||
|
return; |
||||||
|
} |
||||||
|
List<Long> depts = JSONObject.parseArray(message,Long.class); |
||||||
|
if(CollectionUtil.isEmpty(depts)){ |
||||||
|
return; |
||||||
|
} |
||||||
|
TextMessage sendMessage = alarmService.majorAlarm(depts); |
||||||
|
if(ObjectUtil.isEmpty(sendMessage)){ |
||||||
|
return; |
||||||
|
} |
||||||
|
session.sendMessage(sendMessage); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
package com.hnac.hzims.alarm.ws.alart; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.web.socket.WebSocketSession; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
public class AlarmSessionManager { |
||||||
|
/** |
||||||
|
* ws会话池 |
||||||
|
*/ |
||||||
|
public static ConcurrentHashMap<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加会话 |
||||||
|
* |
||||||
|
* @param uid 标记 |
||||||
|
* @param session 会话对象 |
||||||
|
*/ |
||||||
|
public static void add(String uid, WebSocketSession session) { |
||||||
|
if (SESSION_POOL.containsKey(uid)) { |
||||||
|
AlarmSessionManager.removeAndClose(uid); |
||||||
|
} |
||||||
|
SESSION_POOL.put(uid, session); |
||||||
|
log.info("添加 WebSocketSession 会话成功,uid=" + uid); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取 ws 会话 |
||||||
|
* |
||||||
|
* @param uid |
||||||
|
*/ |
||||||
|
public static WebSocketSession get(String uid) { |
||||||
|
return SESSION_POOL.get(uid); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 移除 ws 会话并关闭会话 |
||||||
|
* |
||||||
|
* @param uid |
||||||
|
*/ |
||||||
|
public static void removeAndClose(String uid) { |
||||||
|
WebSocketSession session = SESSION_POOL.get(uid); |
||||||
|
if (session != null) { |
||||||
|
try { |
||||||
|
//关闭连接
|
||||||
|
session.close(); |
||||||
|
} catch (IOException ex) { |
||||||
|
throw new RuntimeException("关闭ws会话失败!", ex); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
SESSION_POOL.remove(uid); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.hnac.hzims.alarm.ws.alart; |
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.web.socket.WebSocketHandler; |
||||||
|
import org.springframework.web.socket.config.annotation.EnableWebSocket; |
||||||
|
import org.springframework.web.socket.config.annotation.WebSocketConfigurer; |
||||||
|
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; |
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@Configuration |
||||||
|
@EnableWebSocket |
||||||
|
public class AlarmSocketConfig implements WebSocketConfigurer{ |
||||||
|
@Override |
||||||
|
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { |
||||||
|
// 集中监控弹框处理器
|
||||||
|
registry.addHandler(monitorHandler(), "/alarm/alart/{uid}").setAllowedOrigins("*"); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public WebSocketHandler monitorHandler() { |
||||||
|
return new AlarmHandler(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public ServerEndpointExporter serverEndpointExporter() { |
||||||
|
return new ServerEndpointExporter(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.hnac.hzims.alarm.ws.alart; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
public class AlarmSocketPool { |
||||||
|
|
||||||
|
public static Map<String, AlarmHandler> pool = new ConcurrentHashMap<>(); |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue