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