【问题标题】:Is there a way to get a list of all users subscribed to a topic?有没有办法获取订阅某个主题的所有用户的列表?
【发布时间】:2023-02-02 22:14:37
【问题描述】:

我正在 Spring Boot 中制作一个 WebSocket Chat 应用程序,我想显示所有已连接用户的列表,是否可以编写某种函数来检索所有已连接用户?

这是我的 WebSocketConfig:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat-example").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }
}

这是控制器:

@Controller
public class ChatController {
    private final MessageRepository messageRepository;

    public ChatController(MessageRepository messageRepository) {
        this.messageRepository = messageRepository;
    }

    @MessageMapping("/chat.send")
    @SendTo("/topic/public")
    public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
        messageRepository.save(chatMessage);
        return chatMessage;
    }

    @MessageMapping("chat.newUser")
    @SendTo("/topic/public")
    public ChatMessage newUser(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        messageRepository.save(chatMessage);
        return chatMessage;
    }
}

【问题讨论】:

  • 简短的回答是:是的
  • 那很好,但是如何呢?

标签: java spring-boot websocket spring-websocket


【解决方案1】:

您可以将已连接的用户会话存储在数据结构(例如 Set)中,并在用户连接或断开连接时更新它。

private static final Map<String, String> connectedUsers = new ConcurrentHashMap<>();

@MessageMapping("/chat.newUser")
@SendTo("/topic/public")
public ChatMessage newUser(@Payload ChatMessage chatMessage,    SimpMessageHeaderAccessor headerAccessor) {
String sessionId = headerAccessor.getSessionId();
String username = chatMessage.getSender();
connectedUsers.put(sessionId, username);
headerAccessor.getSessionAttributes().put("username", username);
messageRepository.save(chatMessage);
return chatMessage;
}

@GetMapping("/connected-users")
public List<String> connectedUsers() {
return new ArrayList<>(connectedUsers.values());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多