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 .
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', ...)
Il semble que vous manquiez une barre oblique dans votre destination:
template.convertAndSendToUser(principal.getName(), "/queue/notification", notifications);