組み込みのMessage BrokerとSTOMP over WebSocketを使用して、Spring 4でリアルタイム通知システムを開発しています。
ユーザー名に従って、特定のユーザーにメッセージを送信できるようにしたいと考えています。この目標を達成するために、次のようにクラスの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経由) では、ユーザー名を指定してチャネルにサブスクライブする必要があります (別の非常によく似た質問: Sending message to specific user on Spring Websocket に従って)。
stompClient.subscribe('/user/' + username + '/horray, ...)
この最後の点は奇妙に聞こえます...
サブスクライブすることにより、webapp でw.whiteとしてログに記録されていると仮定します。
stompClient.subscribe('/user/w.white/horray, ...)
... w.whiteに送信されたメッセージを見ることができます。これは素晴らしいことです...しかし、購読:
stompClient.subscribe('/user/j.pinkman/horray, ...)
...現在 w.white としてログインしているにもかかわらず、j.pinkmanに送信されたメッセージも表示できます。
この問題を克服する方法はありますか?
アップデート
以下は、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