Sessão de primavera + Soquete de mola. Enviar mensagem para um cliente específico com base no ID da sessão

Eu seguiQuitação1 eQuitação2 do estouro de pilha para enviar mensagens para um cliente específico, com base em seu sessionId, mas não foi possível obter sucesso.

Abaixo está minha classe RestController de amostra

@RestController
public class SpringSessionTestApi {

@Autowired
public SimpMessageSendingOperations messagingTemplate;

@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception {

    String sessionId  = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID");
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId));

   }

private MessageHeaders createHeaders(String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    return headerAccessor.getMessageHeaders();
   }
}

ID da sessão: quando o cliente envia a solicitação createSession, o novo spring sessionId é gerado e o mesmo também é armazenado no MongoDB. Depois disso, quando o cliente envia a solicitação de conexão do soquete da web, é recebido o mesmo sessionId que foi armazenado no mongoDb conforme o esperado. Até que tudo esteja funcionando bem.

Agora, meu trabalho é enviar uma resposta ao cliente com base no sessionId. Para isso, tenho abaixo a classe de soquete da web:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
    AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {

@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/messages");
}

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

e o código de cliente de exemplo que estou usando para conectar é:

function connect() {

stompClient = Stomp.client('ws://localhost:8016/messages');
stompClient.debug = null;

stompClient.connect({}, function (frame) {
    setConnected(true);
    console.log('Connected: ' + frame);
    stompClient.subscribe('/user/queue/test', function (greeting) {
        console.log("Hello "+greeting);
        console.log("Greeting body "+JSON.parse(greeting.body));

    });
});
}

Por favor, ajude, onde estou fazendo errado nisso? Desde já, obrigado!

questionAnswers(2)

yourAnswerToTheQuestion