Spring websocket - 如何获取会话数
Spring websocket - how to get number of sessions
我正在使用 this 教程,我正在尝试了解如何获取当前会话数。
我的 WebSocketConfig 看起来像这样(从教程中复制并粘贴):
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
我想知道这个 class 中的会话数(再次复制和粘贴):
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
有没有一种简单的方法可以获取 websocket 的当前会话(用户、连接)数?
编辑:
这是我的解决方案:
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
@EventListener
private void onSessionConnectedEvent(SessionConnectedEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
mySet.add(sha.getSessionId());
}
@EventListener
private void onSessionDisconnectEvent(SessionDisconnectEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
mySet.remove(sha.getSessionId());
}
我现在可以通过 mySet.size()
获取会话数。
您可以使用 ApplicationContext 事件。每个连接、订阅或其他操作都会触发一个特殊事件:SessionConnectEvent、SessionConnectedEvent、SessionSubscribeEvent 等等上。
完整文档是 here。当这些事件之一触发时,您可以使用自己的逻辑来处理它。
示例代码供参考:
@EventListener(SessionConnectEvent.class)
public void handleWebsocketConnectListner(SessionConnectEvent event) {
logger.info("Received a new web socket connection : " + now());
}
@EventListener(SessionDisconnectEvent.class)
public void handleWebsocketDisconnectListner(SessionDisconnectEvent event) {
logger.info("session closed : " + now());
}
您可以使用 SimpUserRegistry
及其 getUserCount()
方法来代替手动处理连接。
示例:
@Autowired
private SimpUserRegistry simpUserRegistry;
public int getNumberOfSessions() {
return simpUserRegistry.getUserCount();
}
我正在使用 this 教程,我正在尝试了解如何获取当前会话数。
我的 WebSocketConfig 看起来像这样(从教程中复制并粘贴):
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
我想知道这个 class 中的会话数(再次复制和粘贴):
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
有没有一种简单的方法可以获取 websocket 的当前会话(用户、连接)数?
编辑:
这是我的解决方案:
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
@EventListener
private void onSessionConnectedEvent(SessionConnectedEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
mySet.add(sha.getSessionId());
}
@EventListener
private void onSessionDisconnectEvent(SessionDisconnectEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
mySet.remove(sha.getSessionId());
}
我现在可以通过 mySet.size()
获取会话数。
您可以使用 ApplicationContext 事件。每个连接、订阅或其他操作都会触发一个特殊事件:SessionConnectEvent、SessionConnectedEvent、SessionSubscribeEvent 等等上。
完整文档是 here。当这些事件之一触发时,您可以使用自己的逻辑来处理它。
示例代码供参考:
@EventListener(SessionConnectEvent.class)
public void handleWebsocketConnectListner(SessionConnectEvent event) {
logger.info("Received a new web socket connection : " + now());
}
@EventListener(SessionDisconnectEvent.class)
public void handleWebsocketDisconnectListner(SessionDisconnectEvent event) {
logger.info("session closed : " + now());
}
您可以使用 SimpUserRegistry
及其 getUserCount()
方法来代替手动处理连接。
示例:
@Autowired
private SimpUserRegistry simpUserRegistry;
public int getNumberOfSessions() {
return simpUserRegistry.getUserCount();
}