Я разрабатываю систему уведомлений в реальном времени в Spring 4, используя встроенный брокер сообщений и STOMP через WebSocket. сильный>.
Я хотел бы иметь возможность отправлять сообщения конкретному пользователю в соответствии с его именем пользователя. Для достижения этой цели я использую метод convertAndSendToUser
класса org.springframework.messaging.simp.SimpMessagingTemplate
следующим образом:
private final MessagingTemplate messagingTemplate;
@Autowired
public LRTStatusListener(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@Scheduled(fixedDelay=5000)
public void sendMessages(Principal principal)
messagingTemplate
.convertAndSendToUser(principal.getName(), "/horray", "Horray, " + principal.getName() + "!");
}
В качестве конфигурации:
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/notifications").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue", "/user");
}
}
На стороне клиента (через JavaScript) я должен подписаться на канал, указав имя пользователя (согласно другому очень похожему вопросу: Отправка сообщения определенному пользователю в Spring Websocket).
stompClient.subscribe('/user/' + username + '/horray, ...)
Последний пункт звучит странно...
Предположим, что я зарегистрирован как w.white в своем веб-приложении, подписавшись:
stompClient.subscribe('/user/w.white/horray, ...)
... Я смогу видеть сообщения, отправленные w.white, и это здорово... Но подписка:
stompClient.subscribe('/user/j.pinkman/horray, ...)
... Я также смогу видеть сообщения, отправленные j.pinkman, несмотря на то, что в настоящее время я зарегистрирован как w.white.
Это способ преодолеть эту проблему?
Обновлять
Ниже приведен лог подключения по WebSocket:
Opening Web Socket...
Web Socket Opened...
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000
<<< CONNECTED
user-name:w.white
heart-beat:0,0
version:1.1
connected to server undefined
Connected: CONNECTED
version:1.1
heart-beat:0,0
user-name:w.white
>>> SUBSCRIBE
id:sub-0
destination:/topic/lrt
>>> SUBSCRIBE
id:sub-1
destination:/user/lrt