web-dev-qa-db-fra.com

Envoyer une notification à un utilisateur spécifique dans le Websocket Spring Boot

Je souhaite envoyer une notification à un client spécifique.

par exemple utilisateur nom d'utilisateur

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends
    AbstractWebSocketMessageBrokerConfigurer {

        @Override
        public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
            stompEndpointRegistry.addEndpoint("/socket")
                    .setAllowedOrigins("*")
                    .withSockJS();
        }

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

        }

Contrôleur

@GetMapping("/notify")
public String getNotification(Principal principal) {
    String username = "user";

    notifications.increment();
    logger.info("counter" + notifications.getCount() + "" + principal.getName());
    //  logger.info("usersend:"+sha.getUser().getName()) ; //user

    template.convertAndSendToUser(principal.getName(), "queue/notification", notifications);

    return "Notifications successfully sent to Angular !";
}

Côté client

Service angulaire

connect() {
    let socket = new SockJs(`api/socket`);

    let stompClient = Stomp.over(socket);

    return stompClient;
}

Composant angulaire

 let stompClient = this.webSocketService.connect();

     stompClient.connect({}, frame => {

      stompClient.subscribe('/user/queue/notification', notifications => {
               console.log('test'+notifications)
          this.notifications = JSON.parse(notifications.body).count;

      })     });

J'ai cherché beaucoup d'autres questions et essayé mais aucune n'a fonctionné pour moi par exemple ici répondu par Thanh Nguyen Van et ici

Console

 Opening Web Socket...
    stomp.js:134 Web Socket Opened...
    stomp.js:134 >>> CONNECT
    accept-version:1.1,1.0
    heart-beat:10000,10000


    stomp.js:134 <<< CONNECTED
    version:1.1
    heart-beat:0,0


    stomp.js:134 connected to server undefined
    reminder.component.ts:18 test callsed
    stomp.js:134 >>> SUBSCRIBE
    id:sub-0
    destination:/user/queue/notification

merci d'avance .

13
naila naseem

La réponse de gerrytan à Envoi d'un message à un utilisateur spécifique sur Spring Websocket mentionne un changement de configuration de socket Web, pour enregistrer le /user préfixe. Dans votre cas, je suppose que cela signifie remplacer

registry.enableSimpleBroker("/topic", "/queue");

avec

registry.enableSimpleBroker("/topic", "/queue", "/user");

Il dit également que dans le contrôleur, vous n'avez pas besoin du /user préfixe car il est ajouté automatiquement. Vous pouvez donc essayer ceci:

template.convertAndSendToUser(principal.getName(), "/queue/notification", notifications);

et ça:

template.convertAndSendToUser(principal.getName(), "/user/queue/notification", notifications);

Côté client, vous devez fournir le nom d'utilisateur que vous avez utilisé pour vous connecter au serveur. Vous pouvez l'insérer directement:

stompClient.subscribe('/user/naila/queue/notification', ...)

ou l'obtenir à partir d'un en-tête. Mais Markus dit à Comment envoyer un message Websocket à un utilisateur concret? que même ici, vous n'avez pas besoin du nom d'utilisateur, donc cela pourrait fonctionner comme ceci:

stompClient.subscribe('/user/queue/notification', ...)
8
edixon

Il semble que vous manquiez une barre oblique dans votre destination:

template.convertAndSendToUser(principal.getName(), "/queue/notification", notifications); 
7
Sergi Almar