[英]Spring WebSocket @SendToSession: send message to specific session
[英]Spring session + Spring web socket. Send message to specific client based on session id
我已经从堆栈溢出跟踪Quetion1和Quetion2 ,根据其sessionId向特定客户端发送消息,但无法找到成功。
下面是我的示例RestController类
@RestController
public class SpringSessionTestApi {
@Autowired
public SimpMessageSendingOperations messagingTemplate;
@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception {
String sessionId = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID");
messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId));
}
private MessageHeaders createHeaders(String sessionId) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}
}
会话ID:当客户端发送createSession请求时,会生成新的spring sessionId,同样也会存储在MongoDB中。 在此之后,当客户端发送Web套接字连接请求时,会收到相同的sessionId,它按预期存储在mongoDb中。 直到这一切都很好。
现在我的工作是根据sessionId将响应发送回客户端。 为此我在web套接字类下面:
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {
@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/messages");
}
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue");
registry.setApplicationDestinationPrefixes("/app");
}
}
我用来连接的示例客户端代码是:
function connect() {
stompClient = Stomp.client('ws://localhost:8016/messages');
stompClient.debug = null;
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/user/queue/test', function (greeting) {
console.log("Hello "+greeting);
console.log("Greeting body "+JSON.parse(greeting.body));
});
});
}
请帮忙,我在哪里做错了? 提前致谢!
如果您正在使用/ user频道,请尝试按照此处所述传递用户。
@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal)
throws Exception {
messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message);
}
我在git中找到了一个完整可行的Spring Stomp Chat项目,链接就在这里。 你可以参考它。 https://gist.github.com/theotherian/9906304
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.