vde*_*ris 5 java spring message-queue rabbitmq spring-jms
我想使用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/");
}
Run Code Online (Sandbox Code Playgroud)
并且,根据文档:
应用程序可以发送针对特定用户的邮件.Spring的STOMP支持识别前缀为"/ user /"的目的地.例如,客户端可能订阅目标"/ user/queue/position-updates".该目的地将由UserDestinationMessageHandler处理并转换为用户会话唯一的目的地,例如"/ queue/position-updates-user123".这提供了订阅一般命名的目的地的便利性,同时确保不与订阅相同目的地的其他用户发生冲突,使得每个用户可以接收唯一的库存位置更新.
在发送方,消息可以发送到目的地,例如"/ user/{username}/queue/position-updates",然后由UserDestinationMessageHandler将其转换为一个或多个目的地,每个目的地对应一个目的地.用户.这允许应用程序中的任何组件发送针对特定用户的消息,而不必知道除其名称和通用目标之外的任何内容.通过注释和消息传递模板也支持此功能.
通过发送消息/user/{username}/queue/something,它将仅传递给标识的特定用户{username}.
现在,我正在寻找一种解决方案,允许我使用外部Message Broker(例如,RabbitMQ),Spring就像Broker Relay一样:
registry.enableStompBrokerRelay("/topic/", "/queue/");
Run Code Online (Sandbox Code Playgroud)
在Spring中配置外部消息代理之后:
/user/{username/}/queue/something?如果有,怎么样?/user/{username/}/queue/something,Spring是否只能{username}根据当前的消息发送该消息Principal?是的,如果您启用外部代理,则每个 @MessageMapping 返回值都将被序列化为 JSON 并发送到代理,请参阅参考文档的消息流部分以获取更多详细信息。所以与简单经纪人基本相同。
您还可以注入SimpMessagingTemplate或SimpMessageSendingOperations bean,就像在我的OpenSnap 示例应用程序中所做的那样。您可以从控制器中使用它,也可以从纯推送上下文中的任何其他类中使用它。
您可以通过向@MessageMapping或@SubscribeMapping处理程序方法添加Principal参数来检索主体,就像这里所做的那样,当前主体将被自动注入。
| 归档时间: |
|
| 查看次数: |
3782 次 |
| 最近记录: |