Spring WebSocket convertAndSendToUser для конкретного sessionID - PullRequest
0 голосов
/ 06 ноября 2018

В качестве этой очереди я хочу отправить конкретному пользователю его sessionID.

И я пробую решение ответа , но клиентская сторона все еще не получает сообщение.

Это мои настройки.

Я сохраняю sessionID пользователя, когда он подключается к серверу

@EventListener
private void handleSessionConnected(SessionConnectEvent event) {
    SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(event.getMessage());
    String username = headers.getNativeHeader("login").get(0);

    String sessionId = headers.getSessionId();

    User user = new User(username, sessionId);

    participantRepository.add(user);

    Success", headers.getMessageHeaders());
}

Обработчик широковещательных сообщений in Контроллер

@MessageMapping("/chat")
public void handleChat(ChatMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception{
    logger.debug(">>>[CHAT MESSAGE]");
    JsonParser parser = new JsonParser();

    String jsonMessage = gson.toJson(message);
    JsonObject jsonObMessage = 
    parser.parse(jsonMessage).getAsJsonObject().get("map").getAsJsonObject();

    messagingTemplate.convertAndSend("/queue", message);

}

Обработчик личных сообщений in Контроллер

@MessageMapping("/chat.{user}")
public void handlePrivateChat(@Payload ChatMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception{
    logger.debug(">>>[PRIVATE CHAT MESSAGE]");

    JsonParser parser = new JsonParser();
    SimpMessageHeaderAccessor responseAccessor = SimpMessageHeaderAccessor
            .create(SimpMessageType.MESSAGE);

    String jsonMessage = gson.toJson(message);
    JsonObject jsonObMessage = 
    parser.parse(jsonMessage).getAsJsonObject().get("map").getAsJsonObject();

    User toUser = activeUsers.getByName(jsonObMessage.get("to").getAsString());
    String destinateSessionID = toUser.getSessionID();
    responseAccessor.setSessionId(destinateSessionID);
    responseAccessor.setLeaveMutable(true);
    MessageHeaders responseMessageHeader =  responseAccessor.getMessageHeaders();

    if(toUser != null){
        messagingTemplate.convertAndSendToUser(destinateSessionID, "/queue", message, responseMessageHeader);
    }

}

Оба обработчика сообщений могли получить сообщение, но клиент мог получить только широковещательное сообщение. Все еще не мог найти ответ. Надеюсь, кто-нибудь может мне помочь. Thx.

Обновление

В моем WebSocketConfig

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue", "/topic");
    registry.setApplicationDestinationPrefixes("/app");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...