From 19654de4dee49c306732d2fa5f665ca2f99f7bad Mon Sep 17 00:00:00 2001 From: ray <1490493387@qq.com> Date: Mon, 26 Aug 2024 00:14:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=AE=9E=E6=97=B6=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=94=A8=E6=88=B7=E7=BB=9F=E8=AE=A1=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/system/config/WebSocketConfig.java | 13 +++++--- .../system/event/UserConnectionEvent.java | 16 ++++++++++ .../system/service/WebsocketService.java | 1 - .../service/impl/WebsocketServiceImpl.java | 32 ++++++++++++------- 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/youlai/system/event/UserConnectionEvent.java diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java index a614c944..815b8841 100644 --- a/src/main/java/com/youlai/system/config/WebSocketConfig.java +++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java @@ -4,12 +4,14 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.jwt.JWTPayload; import cn.hutool.jwt.JWTUtil; import com.youlai.system.common.constant.SecurityConstants; +import com.youlai.system.event.UserConnectionEvent; import com.youlai.system.service.WebsocketService; import groovy.lang.Lazy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.messaging.Message; @@ -36,8 +38,11 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo @Slf4j public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - @Autowired - private WebsocketService websocketService; + private final ApplicationEventPublisher eventPublisher; + + public WebSocketConfig(ApplicationEventPublisher eventPublisher) { + this.eventPublisher = eventPublisher; + } /** * 注册一个端点,客户端通过这个端点进行连接 */ @@ -88,13 +93,13 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { String username = JWTUtil.parseToken(bearerToken).getPayloads().getStr(JWTPayload.SUBJECT); if (StrUtil.isNotBlank(username)) { accessor.setUser(() -> username); - websocketService.addUser(username); + eventPublisher.publishEvent(new UserConnectionEvent(this, username, true)); } } } else if (StompCommand.DISCONNECT.equals(accessor.getCommand())) { if (accessor.getUser() != null) { String username = accessor.getUser().getName(); - websocketService.removeUser(username); + eventPublisher.publishEvent(new UserConnectionEvent(this, username, false)); } } } diff --git a/src/main/java/com/youlai/system/event/UserConnectionEvent.java b/src/main/java/com/youlai/system/event/UserConnectionEvent.java new file mode 100644 index 00000000..c381a87b --- /dev/null +++ b/src/main/java/com/youlai/system/event/UserConnectionEvent.java @@ -0,0 +1,16 @@ +package com.youlai.system.event; + +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +@Getter +public class UserConnectionEvent extends ApplicationEvent { + private final String username; + private final boolean connected; + + public UserConnectionEvent(Object source, String username, boolean connected) { + super(source); + this.username = username; + this.connected = connected; + } +} diff --git a/src/main/java/com/youlai/system/service/WebsocketService.java b/src/main/java/com/youlai/system/service/WebsocketService.java index daf64158..b9b4254d 100644 --- a/src/main/java/com/youlai/system/service/WebsocketService.java +++ b/src/main/java/com/youlai/system/service/WebsocketService.java @@ -6,5 +6,4 @@ public interface WebsocketService { void removeUser(String username) ; - int getOnlineUserCount() ; } diff --git a/src/main/java/com/youlai/system/service/impl/WebsocketServiceImpl.java b/src/main/java/com/youlai/system/service/impl/WebsocketServiceImpl.java index 613251c7..8593761e 100644 --- a/src/main/java/com/youlai/system/service/impl/WebsocketServiceImpl.java +++ b/src/main/java/com/youlai/system/service/impl/WebsocketServiceImpl.java @@ -1,9 +1,10 @@ package com.youlai.system.service.impl; +import com.youlai.system.event.UserConnectionEvent; import com.youlai.system.service.WebsocketService; -import groovy.lang.Lazy; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -12,13 +13,13 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @Service +@Slf4j +@RequiredArgsConstructor public class WebsocketServiceImpl implements WebsocketService { - @Lazy - @Autowired - private SimpMessagingTemplate messagingTemplate; + private final SimpMessagingTemplate messagingTemplate; - private static final Set onlineUsers = ConcurrentHashMap.newKeySet(); + private final Set onlineUsers = ConcurrentHashMap.newKeySet(); @Override public void addUser(String username) { @@ -30,15 +31,22 @@ public class WebsocketServiceImpl implements WebsocketService { onlineUsers.remove(username); } - @Override - public int getOnlineUserCount() { - return onlineUsers.size(); + @EventListener + public void handleUserConnectionEvent(UserConnectionEvent event) { + String username = event.getUsername(); + if (event.isConnected()) { + onlineUsers.add(username); + log.info("User connected: {}", username); + } else { + onlineUsers.remove(username); + log.info("User disconnected: {}", username); + } + // 推送在线用户人数 + messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUsers.size()); } @Scheduled(fixedRate = 5000) public void sendOnlineUserCount() { - int onlineUserCount = this.getOnlineUserCount(); - messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUserCount); + messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUsers.size()); } - }