我正在使用内置的消息代理和WebSocket上的STOMP,在Spring 4中开发实时通知系统。
我希望能够按照用户名向特定用户发送消息。为了实现这个目标,我使用了org.springframework.messaging.simp.SimpMessagingTemplate类的convertAndSendToUser方法,如下所示:
这最后一个点听起来很奇怪...
假设我在我的Web应用程序上登录为w.white,通过订阅:
我希望能够按照用户名向特定用户发送消息。为了实现这个目标,我使用了org.springframework.messaging.simp.SimpMessagingTemplate类的convertAndSendToUser方法,如下所示:
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, ...)
这最后一个点听起来很奇怪...
假设我在我的Web应用程序上登录为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
:-(
,我该如何在这里获取用户messagingTemplate.convertAndSendToUser(?, "/queue/horray", "Horray, ?");
- Shantaram Tupe