Bagaimana cara mengirim pesan websocket hanya ke satu pengguna?

Saat saya mengirim pesan menggunakan anotasi @SendToUser, itu sudah selesai. Saya menerima pesan di sisi klien.

Tetapi ketika saya mengirim pesan menggunakan msgTempl.convertAndSendToUser(...) maka saya tidak bisa mendapatkan respons di sisi klien saya.

Ikuti kode saya:

@RestController
public class NotifyController {

private final SimpMessagingTemplate messagingTemplate;

@Autowired
public NotifyController(SimpMessagingTemplate messagingTemplate) {
    this.messagingTemplate = messagingTemplate;
}

@MessageMapping("/chat.send")

/* @SendToUser("/queue/ns-queue")*/

public Message sendMessage(@Payload Message message, 
@Header("simpSessionId") String sessionId) {

    messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue", 
message);


    return message;
}

@MessageMapping("/chat.register")/*
@SendToUser("/queue/ns-queue")*/
public Message addUser(@Payload Message message,
                       SimpMessageHeaderAccessor headerAccessor, 
@Header("simpSessionId") String sessionId) {

    messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue", 
message);

    return message;
}

}

Konfigurasi Ws:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements 
WebSocketMessageBrokerConfigurer {

private final WebSocketConfigurationProperties configurationProperties;

@Autowired
public WebSocketConfiguration(WebSocketConfigurationProperties 
configurationProperties) {
    this.configurationProperties = configurationProperties;
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker(configurationProperties.getTopic());

config.
setApplicationDestinationPrefixes(configurationProperties.getAppPrefix());
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {

registry.addEndpoint(configurationProperties.getEndpoint()).withSockJS();
}

}

Di sisi klien:

 function connect(event) {
 username = document.querySelector('#name').value.trim();

 if(username) {
    usernamePage.classList.add('hidden');
    chatPage.classList.remove('hidden');

    var socket = new SockJS('/ns/ws/endpoint');
    stompClient = Stomp.over(socket);

    stompClient.connect({}, onConnected, onError);

 }
 event.preventDefault();
 }


 function onConnected(payload) {
 // Subscribe to the Public Topic
 stompClient.subscribe('/user/queue/ns-queue', onMessageReceived);

 // Tell your username to the server
 stompClient.send("/ns/ws/chat.register",
    {},
    JSON.stringify({sender: username, type: 'JOIN'})
 )

 connectingElement.classList.add('hidden');
 }

Saya tidak menggunakan keamanan pegas.

Tolong bantu aku! Mengapa saya tidak dapat mengirim dan menerima pesan saat saya menggunakan SimpMessagingTemplate?


person resclub    schedule 09.09.2019    source sumber


Jawaban (1)


saya menemukan solusi. Anda hanya perlu menambahkan sessionId di header dan meneruskan header ini ke metode convertAndSendTosUser seperti ini:

 private void sendMessageToUser(@Payload Message message,
                               @Header("simpSessionId") String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = 
               SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    messagingTemplate.convertAndSendToUser(sessionId,
            socketConfigurationProperties.getTopic(), message, 
    headerAccessor.getMessageHeaders());
  } 
person resclub    schedule 12.09.2019