通话逻辑

This commit is contained in:
张良(004796)
2023-12-28 21:35:37 +08:00
parent f337f57df5
commit 49922904ec
34 changed files with 984 additions and 50 deletions

View File

@@ -1,13 +1,10 @@
package com.ruoyi.websocket.config;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.websocket.handler.PlusWebSocketHandler;
import com.ruoyi.websocket.interceptor.PlusWebSocketInterceptor;
import com.ruoyi.websocket.listener.WebSocketTopicListener;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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;
@@ -18,7 +15,7 @@ import org.springframework.web.socket.server.HandshakeInterceptor;
*
* @author zendwang
*/
@AutoConfiguration
@Configuration
@ConditionalOnProperty(value = "websocket.enabled", havingValue = "true")
@EnableConfigurationProperties(WebSocketProperties.class)
@EnableWebSocket
@@ -29,7 +26,7 @@ public class WebSocketConfig {
WebSocketHandler webSocketHandler,
WebSocketProperties webSocketProperties) {
if (StrUtil.isBlank(webSocketProperties.getPath())) {
webSocketProperties.setPath("/websocket");
webSocketProperties.setPath("/ws");
}
if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) {
@@ -42,18 +39,4 @@ public class WebSocketConfig {
.setAllowedOrigins(webSocketProperties.getAllowedOrigins());
}
@Bean
public HandshakeInterceptor handshakeInterceptor() {
return new PlusWebSocketInterceptor();
}
@Bean
public WebSocketHandler webSocketHandler() {
return new PlusWebSocketHandler();
}
@Bean
public WebSocketTopicListener topicListener() {
return new WebSocketTopicListener();
}
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.websocket.handle;
import org.springframework.web.socket.WebSocketSession;
public interface IOpenLogic {
void processOn(WebSocketSession session);
}

View File

@@ -2,14 +2,18 @@ package com.ruoyi.websocket.handler;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.websocket.dto.WebSocketMessageDto;
import com.ruoyi.websocket.handle.IOpenLogic;
import com.ruoyi.websocket.holder.WebSocketSessionHolder;
import com.ruoyi.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.ruoyi.websocket.constant.WebSocketConstants.LOGIN_USER_KEY;
@@ -19,16 +23,22 @@ import static com.ruoyi.websocket.constant.WebSocketConstants.LOGIN_USER_KEY;
* @author zendwang
*/
@Slf4j
@Component
public class PlusWebSocketHandler extends AbstractWebSocketHandler {
@Autowired
private IOpenLogic openLogic;
/**
* 连接成功后
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) {
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
Map<String, Object> attributes = session.getAttributes();
if(attributes.get("token") != null){
WebSocketSessionHolder.addSession(attributes.get("token").toString(), session);
}
openLogic.processOn(session);
log.info("[connect] sessionId: {},userId:{}", session.getId(), session.getId());
}
/**

View File

@@ -16,27 +16,27 @@ import java.util.concurrent.ConcurrentHashMap;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class WebSocketSessionHolder {
private static final Map<Long, WebSocketSession> USER_SESSION_MAP = new ConcurrentHashMap<>();
private static final Map<String, WebSocketSession> USER_SESSION_MAP = new ConcurrentHashMap<>();
public static void addSession(Long sessionKey, WebSocketSession session) {
public static void addSession(String sessionKey, WebSocketSession session) {
USER_SESSION_MAP.put(sessionKey, session);
}
public static void removeSession(Long sessionKey) {
public static void removeSession(String sessionKey) {
if (USER_SESSION_MAP.containsKey(sessionKey)) {
USER_SESSION_MAP.remove(sessionKey);
}
}
public static WebSocketSession getSessions(Long sessionKey) {
public static WebSocketSession getSessions(String sessionKey) {
return USER_SESSION_MAP.get(sessionKey);
}
public static Set<Long> getSessionsAll() {
public static Set<String> getSessionsAll() {
return USER_SESSION_MAP.keySet();
}
public static Boolean existSession(Long sessionKey) {
public static Boolean existSession(String sessionKey) {
return USER_SESSION_MAP.containsKey(sessionKey);
}
}

View File

@@ -5,6 +5,7 @@ import com.ruoyi.common.helper.LoginHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
@@ -18,6 +19,7 @@ import static com.ruoyi.websocket.constant.WebSocketConstants.LOGIN_USER_KEY;
* @author zendwang
*/
@Slf4j
@Component
public class PlusWebSocketInterceptor implements HandshakeInterceptor {
/**

View File

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* WebSocket 主题订阅监听器
@@ -14,6 +15,7 @@ import org.springframework.core.Ordered;
* @author zendwang
*/
@Slf4j
@Component
public class WebSocketTopicListener implements ApplicationRunner, Ordered {
@Override

View File

@@ -34,20 +34,11 @@ public class WebSocketUtils {
* @param sessionKey session主键 一般为用户id
* @param message 消息文本
*/
public static void sendMessage(Long sessionKey, String message) {
public static void sendMessage(String sessionKey, String message) {
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
sendMessage(session, message);
}
/**
* 订阅消息
*
* @param consumer 自定义处理
*/
public static void subscribeMessage(Consumer<WebSocketMessageDto> consumer) {
RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer);
}
/**
* 发布订阅的消息
*
@@ -107,4 +98,5 @@ public class WebSocketUtils {
}
}
}
}