Отправка уведомления конкретному пользователю в веб-загрузке весны загрузки
Я хочу отправить уведомление конкретному клиенту.
например, имя пользователя
@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");
}
контроллер
@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 !";
}
Сторона клиента
Угловое обслуживание
connect() {
let socket = new SockJs('api/socket');
let stompClient = Stomp.over(socket);
return stompClient;
}
Угловой компонент
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;
}) });
Я искал много других вопросов и пытался, но никто из них не работал для меня, например, здесь ответил Тхан Нгуен Ван и здесь
Приставка
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
заранее спасибо.
Ответы
Ответ 1
Ответ gerrytan на " Отправить сообщение" конкретному пользователю в Spring Websocket упоминает изменение конфигурации веб-сокета, чтобы зарегистрировать префикс /user
. В вашем случае я предполагаю, что это означает заменить
registry.enableSimpleBroker("/topic", "/queue");
с
registry.enableSimpleBroker("/topic", "/queue", "/user");
Он также говорит, что в контроллере вам не нужен префикс /user
поскольку он добавляется автоматически. Поэтому вы можете попробовать следующее:
template.convertAndSendToUser(principal.getName(), "/queue/notification", notifications);
и это:
template.convertAndSendToUser(principal.getName(), "/user/queue/notification", notifications);
На стороне клиента вам необходимо указать имя пользователя, которое вы использовали для подключения к серверу. Вы можете вставить его напрямую:
stompClient.subscribe('/user/naila/queue/notification', ...)
или получить его из заголовка. Но Маркус говорит, как отправить сообщение websocket конкретному пользователю? что даже здесь вам не нужно имя пользователя, поэтому он может работать следующим образом:
stompClient.subscribe('/user/queue/notification', ...)
Ответ 2
Кажется, у вас отсутствует косая черта в пункте назначения:
template.convertAndSendToUser(principal.getName(), "/queue/notification", notifications);