10

我正在使用教程,并试图弄清楚如何获取当前会话的数量。

我的 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();
    }

}

我想知道这个类中的会话数(再次复制和粘贴):

@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().

4

2 回答 2

20

您可以使用SimpUserRegistry和它的getUserCount()方法,而不是手动处理连接。

例子:

@Autowired
private SimpUserRegistry simpUserRegistry;

public int getNumberOfSessions() {
    return simpUserRegistry.getUserCount();
}
于 2018-05-22T12:19:06.360 回答
10

您可以使用ApplicationContext事件。每个连接、订阅或其他操作都会触发一个特殊事件:SessionConnectEventSessionConnectedEventSessionSubscribeEvent等。

完整的文档在这里。当其中一个事件触发时,您可以使用自己的逻辑来处理它。

示例代码供参考:

@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());
}
于 2016-09-24T19:51:40.090 回答