跳到主要内容

连接到代理服务器

ChatGPT-4o-mini 中英对照 Connecting to a Broker

一个 STOMP 代理中继维护与代理的单个“系统” TCP 连接。此连接仅用于来自服务器端应用程序的消息,而不是用于接收消息。您可以为此连接配置 STOMP 凭据(即 STOMP 帧 loginpasscode 头)。这在 XML 命名空间和 Java 配置中都以 systemLoginsystemPasscode 属性的形式暴露,默认值为 guestguest

STOMP 中介中继还为每个连接的 WebSocket 客户端创建一个单独的 TCP 连接。您可以配置用于代表客户端创建的所有 TCP 连接的 STOMP 凭据。这在 XML 命名空间和 Java 配置中都以 clientLoginclientPasscode 属性的形式暴露,默认值为 guestguest

备注

STOMP 中继代理始终在它代表客户端转发给代理的每个 CONNECT 帧上设置 loginpasscode 头。因此,WebSocket 客户端不需要设置这些头。它们会被忽略。正如 Authentication 部分所解释的,WebSocket 客户端应依赖 HTTP 认证来保护 WebSocket 端点并建立客户端身份。

STOMP 代理中继还通过“系统” TCP 连接向消息代理发送和接收心跳。您可以配置发送和接收心跳的间隔(默认每个 10 秒)。如果与代理的连接丢失,代理中继将继续尝试每 5 秒重新连接,直到成功为止。

任何 Spring bean 都可以实现 ApplicationListener<BrokerAvailabilityEvent> 以接收通知,当与 broker 的“系统”连接丢失并重新建立时。例如,一个广播股票报价的股票报价服务可以在没有活动的“系统”连接时停止尝试发送消息。

默认情况下,STOMP 中介代理始终连接,并在连接丢失时根据需要重新连接到相同的主机和端口。如果您希望提供多个地址,在每次连接尝试时,您可以配置一个地址供应者,而不是固定的主机和端口。以下示例展示了如何做到这一点:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

// ...

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/queue/", "/topic/").setTcpClient(createTcpClient());
registry.setApplicationDestinationPrefixes("/app");
}

private ReactorNettyTcpClient<byte[]> createTcpClient() {
return new ReactorNettyTcpClient<>(
client -> client.remoteAddress(() -> new InetSocketAddress(0)),
new StompReactorNettyCodec());
}
}
java

您还可以使用 virtualHost 属性配置 STOMP 中继代理。该属性的值被设置为每个 CONNECT 帧的 host 头,并且在某些情况下非常有用(例如,在云环境中,实际建立 TCP 连接的主机与提供基于云的 STOMP 服务的主机不同)。