0

This is my WebSocketConfiguration Code

@EnableWebSocketMessageBroker
@Configuration
@RequiredArgsConstructor
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/my-chat").setAllowedOriginPatterns("*");
    }
    
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/pub");
        registry.enableSimpleBroker("/sub");
    }

}

And I connect STOMP Connection . Url is "ws://localhost:8080/my-chat", Connection-Type : STOMP, Subscription URL: "sub/hello".

I already checked connection in Spring Output terminal.

 [MessageBroker-8] o.s.w.s.c.WebSocketMessageBrokerStats    : WebSocketSession[2 current WS(2)-HttpStream(0)-HttpPoll(0), 3 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(1)-CONNECTED(1)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 9, active threads = 0, queued tasks = 0, completed tasks = 9], outboundChannel[pool size = 2, active threads = 0, queued tasks = 0, completed tasks = 2], sockJsScheduler[pool size = 8, active threads = 1, queued tasks = 1, completed tasks = 60]

But , when I can't get connected session numbers in Spring code. This is my code.

@Autowired
private SimpUserRegistry simpUserRegistry;

@Scheduled(fixedRate = 1000)
public void getConnectedUserSessions() {
    System.out.println(simpUserRegistry.getUserCount());
}

It always print 0. How can I get connected stomp session?

I try stomp connection with apic chrome extensions. stomp connected But I can't get connect session user in spring code.

Viper
  • 3
  • 2

1 Answers1

0

As described here, only authenticated users are added to the registry.

My workaround is to implement ChannelInterceptor and count it manually:

@Component
public class WebSocketMetricLogger implements ChannelInterceptor {
    private final Set<String> connectedSessionIds;

    public WebSocketMetricLogger() {
        this.connectedSessionIds = Collections.synchronizedSet(new HashSet<>());
    }

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        var accessor = StompHeaderAccessor.wrap(message);
        var command = accessor.getCommand();
        var sessionId = accessor.getSessionId();

        if (command == null || sessionId == null) {
            return message;
        }

        if (command == StompCommand.CONNECT) {
            connectedSessionIds.add(sessionId);
        } else if (command == StompCommand.DISCONNECT) {
            connectedSessionIds.remove(sessionId);
        }

        return message;
    }
}

@Configuration
@EnableWebSocketMessageBroker
public class DefaultWebSocketMessageBrokerConfigurer implements WebSocketMessageBrokerConfigurer {
    private final WebSocketMetricLogger webSocketMetricLogger;

    @Autowired
    public DefaultWebSocketMessageBrokerConfigurer(WebSocketMetricLogger webSocketMetricLogger) {
        this.webSocketMetricLogger = webSocketMetricLogger;
    }

    ...

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(webSocketMetricLogger);
    }
}

Note that to avoid duplicate DISCONNECT events, record session IDs instead of session count.

chehsunliu
  • 1,559
  • 1
  • 12
  • 22
  • Thanks for the answer I didn't know that only authenticated users ard added to the registry. It helped me solve the problem. Thank you!! – Viper Jul 19 '23 at 06:58