我想使用 Spring Messaging 为我的webapp为已登录用户创建实时通知系统。
我将AbstractWebSocketMessageBrokerConfigurer
定义如下:
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/notifications").withSockJS()
.setSessionCookieNeeded(true)
.setWebSocketEnabled(true);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic/", "/queue/");
}
并且,根据文件:
应用程序可以发送针对特定用户的邮件。 Spring的STOMP支持可识别前缀为“/ user /”的目的地。例如,客户端可能订阅目标“/ user / queue / position-updates”。该目的地将由UserDestinationMessageHandler处理并转换为用户会话唯一的目的地,例如, “/队列/位置更新-user123”。这样可以方便地订阅一般命名的目的地,同时确保不会与订阅同一目的地的其他用户发生冲突,这样每个用户都可以接收到唯一的库存位置更新。
在发送方,消息可以发送到目的地,例如“/ user / {username} / queue / position-updates”,然后由UserDestinationMessageHandler将其转换为一个或多个目的地,每个会话一个与用户相关联。这允许应用程序中的任何组件发送针对特定用户的消息,而不必知道除其名称和通用目标之外的任何内容。通过注释和消息模板也支持这一点。
通过向/user/{username}/queue/something
发送消息,该消息将仅发送给{username}
标识的特定用户。
现在,我正在寻找一种解决方案,允许我使用外部 Message Broker (例如, RabbitMQ ),Spring就像 Broker一样中继:
registry.enableStompBrokerRelay("/topic/", "/queue/");
在Spring中配置外部消息代理后:
/user/{username/}/queue/something
在Message Broker上发送消息?如果是,怎么样?/user/{username/}/queue/something
在Message Broker上发送消息,Spring是否能够根据当前{username}
仅将该消息发送到Principal
?答案 0 :(得分:1)
是的,如果启用外部代理,每个@MessageMapping返回值都将被序列化为JSON并发送给代理,请查看参考文档的Flow of Messages section以获取更多详细信息。所以它与简单的经纪人基本相同。
你也可以注入一个SimpMessagingTemplate或SimpMessageSendingOperations bean,就像在OpenSnap example application中完成的那样。您可以在Controller中使用它,也可以在纯推送上下文中的任何其他类中使用它。
您可以通过向@MessageMapping或@SubscribeMapping处理程序方法添加Principal参数来检索主体,就像它已完成here一样,将自动注入当前主体。