Веб-сокет SpringBoot с RabbitMQ отправляет сообщение определенному клиенту - PullRequest
0 голосов
/ 22 февраля 2019

Я использую springboot-websocket для функции чата.Я использую rabbitmq в качестве брокера.Я не могу отправить сообщение конкретному пользователю.

Из многих блогов и учебных пособий я понял, что мы можем отправить сообщение конкретному пользователю, используя метод template.convertAndSendToUser(...).

Но первый аргумент, который принимает метод, этоString имя пользователя.Что это за имя пользователя?

public class CustomSubProtocolWebSocketHandler extends SubProtocolWebSocketHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomSubProtocolWebSocketHandler.class);

    @Autowired
    private UserCommons userCommons;

    CustomSubProtocolWebSocketHandler( MessageChannel clientInboundChannel, SubscribableChannel clientOutboundChannel )
    {
        super(clientInboundChannel, clientOutboundChannel);
    }

    @Override
    public void afterConnectionEstablished( WebSocketSession session ) throws Exception
    {
        LOGGER.info(
                "************************************************************************************************************************New webSocket connection was established: {}",
                session);
        String token = session.getUri().getQuery().replace("token=", "");
        String user = Jwts.parser().setSigningKey(TokenConstant.SECRET)
                .parseClaimsJws(token.replace(TokenConstant.TOKEN_PREFIX, "")).getBody().getSubject();
        Optional<UserModel> userModelOptional = userCommons.getUserByEmail(user);
        if( !userModelOptional.isPresent() )
        {
            LOGGER.error(
                    "************************************************************************************************************************Invalid token is passed with web socket request");
            throw new DataException(GeneralConstants.EXCEPTION, "Invalid user", HttpStatus.BAD_REQUEST);
        }
        super.afterConnectionEstablished(session);
    }

    @Override
    public void afterConnectionClosed( WebSocketSession session, CloseStatus closeStatus ) throws Exception
    {
        LOGGER.error(
                "************************************************************************************************************************webSocket connection was closed");
        LOGGER.error(closeStatus.getReason());
        super.afterConnectionClosed(session, closeStatus);
    }

    @Override
    public void handleTransportError( WebSocketSession session, Throwable exception ) throws Exception
    {

        LOGGER.error(
                "************************************************************************************************************************Connection closed unexpectedly");
        LOGGER.error(GeneralConstants.ERROR, exception);
        super.handleTransportError(session, exception);
    }
}

В этом CustomSubProtocolWebSocketHandler я могу получить WebSocket-session-id.Но если я использую session-id в качестве первого параметра, сообщение не будет отправлено этому пользователю.Как я могу получить имя пользователя?

...