使用外部消息代理作为代理中继的 Spring

Posted

技术标签:

【中文标题】使用外部消息代理作为代理中继的 Spring【英文标题】:Spring as Broker Relay by using an external Message Broker 【发布时间】:2014-10-30 03:36:00 【问题描述】:

我想使用 Spring Messaging 为我的 web 应用的登录用户创建一个实时通知系统。

我定义了一个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 中配置 External Message Broker 之后:

是否可以使用作为通道/user/username//queue/something 在 Message Broker 上发送消息?如果是,怎么做? 通过使用/user/username//queue/something 作为通道在Message Broker 上发送消息,Spring 是否能够根据当前的Principal 仅将该消息发送到username

【问题讨论】:

【参考方案1】:

是的,如果您启用外部代理,每个@MessageMapping 返回值都将被序列化为 JSON 并发送到代理,请参阅参考文档的Flow of Messages section 了解更多详细信息。所以和简单的broker基本一样。

您还可以注入 SimpMessagingTemplate 或 SimpMessageSendingOperations bean,就像在我的 OpenSnap example application 中所做的那样。您可以从 Controller 中使用它,也可以从纯推送上下文中的任何其他类中使用它。

您可以通过在 @MessageMapping 或 @SubscribeMapping 处理程序方法中添加 Principal 参数来检索主体,就像 here 所做的那样,当前主体将被自动注入。

【讨论】:

以上是关于使用外部消息代理作为代理中继的 Spring的主要内容,如果未能解决你的问题,请参考以下文章

Windows server2008 DHCP中继代理

Windows server2008 DHCP中继代理

DHCP中继代理配置

DHCP中继

CentOS7.3下关于DHCP中继代理服务器的详细配置

使用sever2008做DHCP中继代理