stompClient.connect(login, password, callback())
这将导致带有登录和密码的“STOMP凭据”的连接请求,例如,如果我们处理SessionConnectEvent http://www.sergialmar.com/2014/03/detect-websocket-connects-and-disconnects-in-spring-4/
但我还不清楚这是否是服务器端向队列发送操作中的“用户”:
simpMessagingTemplate.convertAndSendToUser(username, "/queue/reply", message);
我能得到的最接近的是读到这个线程在Spring Websocket上向特定用户发送消息,由Thanh Nguyen Van回答,但仍然不清楚。
我们知道可以使用客户机订阅的主题前缀从stomp服务器向客户机发送消息,例如/topic/hello
。我们还知道可以向特定用户发送消息,因为spring提供convertandsendtouser(username,destination,message)
API。它接受一个字符串用户名,这意味着如果我们对每个连接都有一个唯一的用户名,我们应该能够向订阅主题的特定用户发送消息。
不太了解的是,这个用户名是从哪里来的?
这个用户名是java.security.principal
接口的一部分。每个StompHeaderAccessor
或WebSocketSession
对象都有此主体的实例,您可以从中获取用户名。然而,根据我的实验,它不是自动生成的。它必须由服务器为每个会话手动生成。
class StompPrincipal implements Principal {
String name
StompPrincipal(String name) {
this.name = name
}
@Override
String getName() {
return name
}
}
class CustomHandshakeHandler extends DefaultHandshakeHandler {
// Custom class for storing principal
@Override
protected Principal determineUser(
ServerHttpRequest request,
WebSocketHandler wsHandler,
Map<String, Object> attributes
) {
// Generate principal with UUID as name
return new StompPrincipal(UUID.randomUUID().toString())
}
}
@Override
void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry
.addEndpoint("/stomp") // Set websocket endpoint to connect to
.setHandshakeHandler(new CustomHandshakeHandler()) // Set custom handshake handler
.withSockJS() // Add Sock JS support
}
就是这样。现在您的服务器被配置为为每个连接生成唯一的主体名称。它将该主体作为stompheaderaccessor
对象的一部分传递,您可以通过连接事件侦听器、消息传递函数等访问这些对象。
来自事件侦听器:
@EventListener
void handleSessionConnectedEvent(SessionConnectedEvent event) {
// Get Accessor
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage())
}
来自消息映射API
@MessageMapping('/hello')
protected void hello(SimpMessageHeaderAccessor sha, Map message) {
// sha available in params
}
convertAndSendToUser(sha.session.principal.name, '/topic/hello', message)
client.subscribe('/user/topic/hello', callback)
问题内容: 我想了解convertAndSendToUser如何在Spring SockJS + Websocket框架中工作。 在客户端,我们将连接为 这将导致使用登录名和密码的“ Stomp凭据”进行连接请求,例如,如果我们处理SessionConnectEvent http://www.sergialmar.com/2014/03/detect-websocket-connects-and-
我正在尝试使用Springframework SimpMessageTemplate(默认Stomp实现)来流式传输时间序列数据,以将消息广播到SockJS客户端订阅的主题。但是,这些消息是按顺序接收的。服务器是单线程的,消息按时间戳升序发送。客户端以某种方式接收到了顺序错误的消息。 我使用的是stompjs和springframework的最新版本(4.1.6版本)。
一、STOMP协议介绍 STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。 STOMP协议的前身是TTMP协
我最近添加了一个ActiveMQ服务器,使用Amazon自动伸缩组/负载平衡器来处理应用程序的水平伸缩。 我使用方法,该方法在应用程序的单个实例上工作,以定位经过身份验证的用户的“单独队列”,因此只有他们接收消息。 然而,当我启动负载均衡器后面的应用程序时,我发现只有当事件是在他们的websocket-proxy连接(到代理)建立的服务器上生成的时候,消息才会发送给用户? 通过检查(当用户订阅用户
SockJS 是一个浏览器上运行的 JavaScript 库,如果浏览器不支持 WebSocket,该库可以模拟对 WebSocket 的支持,实现浏览器和 Web 服务器之间低延迟、全双工、跨域的通讯通道。 SockJS family: SockJS-client JavaScript client library SockJS-node Node.js server SockJS-erlang
SockJS-node is a Node.js server side counterpart of SockJS-client browser library written in CoffeeScript. To install sockjs-node run: npm install sockjs (If you see rbytes dependecy failing, don't wo
在我的场景中,我希望用户订阅一个固定的websocketendpoint,并且在订阅时不需要提及队列名或主题。我想处理控制器内部的逻辑,以便从各自的队列中获取消息并将消息发送回每个用户。我想达到的目标是:- 我的客户端代码首先连接到websocketendpoint/websocket:- 然后通过websocket发送STOMP connect and subscribe帧 正在工作的服务器端代
我想了解convertAndSendToUser如何在SpringSockJSWebSocket框架中工作。 在客户端中,我们将作为 这将导致连接请求与"跺脚凭据"的登录名和密码,这可以看到,例如,如果我们处理SessionConnect事件http://www.sergialmar.com/2014/03/detect-websocket-connects-and-disconnects-in-