External Broker

    简单的代理对于入门是很好的,但它只支持 STOMP 命令的一个子集(它不支持 acks、receipts 和其他一些功能),依赖于一个简单的消息发送循环,并且不适合集群。作为一种选择,你可以升级你的应用程序以使用全功能的消息代理。

    请参阅您所选择的消息代理(如 RabbitMQActiveMQ 和其他)的 STOMP 文档,安装该代理,并在启用 STOMP 支持的情况下运行它。然后你可以在 Spring 配置中启用 STOMP 代理中继(而不是简单的代理)。

    下面的配置示例启用了一个全功能的代理:

    1. @Configuration
    2. @EnableWebSocketMessageBroker
    3. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    4. @Override
    5. public void registerStompEndpoints(StompEndpointRegistry registry) {
    6. registry.addEndpoint("/portfolio").withSockJS();
    7. }
    8. @Override
    9. public void configureMessageBroker(MessageBrokerRegistry registry) {
    10. registry.enableStompBrokerRelay("/topic", "/queue");
    11. registry.setApplicationDestinationPrefixes("/app");
    12. }
    13. }

    下面是 xml 的方式

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:websocket="http://www.springframework.org/schema/websocket"
    4. xsi:schemaLocation="
    5. http://www.springframework.org/schema/beans
    6. https://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/websocket
    8. https://www.springframework.org/schema/websocket/spring-websocket.xsd">
    9. <websocket:message-broker application-destination-prefix="/app">
    10. <websocket:stomp-endpoint path="/portfolio" />
    11. <websocket:sockjs/>
    12. </websocket:stomp-endpoint>
    13. <websocket:stomp-broker-relay prefix="/topic,/queue" />
    14. </websocket:message-broker>
    15. </beans>

    前面配置中的 STOMP 代理中继器是一个 Spring MessageHandler,它通过将消息转发给外部消息代理来处理消息。为此,它建立了与 broker 的TCP 连接,将所有消息转发给 broker ,然后通过客户的 WebSocket 会话将从 brpler 收到的所有消息转发给客户。从本质上讲,它充当了一个 中转站,在两个方向上转发消息。

    :::info 将 io.projectreactor.netty:reactor-netty 和 io.netty:netty-all 依赖项添加到你的项目中,用于 TCP 连接管理。 :::

    此外,应用组件(如 HTTP 请求处理方法、业务服务等)也可以向代理中继器发送消息,如 发送消息 中所述,向订阅的 WebSocket 客户端广播消息。

    实际上,代理中继器实现了强大的、可扩展的消息广播。