连接到代理

STOMP 代理中继维护与代理的单个“系统” TCP 连接。此连接仅用于来自服务器端应用程序的消息,不用于接收消息。您可以为此连接配置 STOMP 凭据(即 STOMP 帧的 `login` 和 `passcode` 标头)。这在 XML 命名空间和 Java 配置中都以 `systemLogin` 和 `systemPasscode` 属性的形式公开,默认值为 `guest` 和 `guest`。

STOMP 代理中继还会为每个连接的 WebSocket 客户端创建单独的 TCP 连接。您可以配置用于代表客户端创建的所有 TCP 连接的 STOMP 凭据。这在 XML 命名空间和 Java 配置中都以 `clientLogin` 和 `clientPasscode` 属性的形式公开,默认值为 `guest` 和 `guest`。

STOMP 代理中继始终在代表客户端转发到代理的每个 `CONNECT` 帧上设置 `login` 和 `passcode` 标头。因此,WebSocket 客户端无需设置这些标头。它们将被忽略。如 身份验证 部分所述,WebSocket 客户端应改为依靠 HTTP 身份验证来保护 WebSocket 端点并建立客户端身份。

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

任何 Spring Bean 都可以实现 `ApplicationListener<BrokerAvailabilityEvent>` 以接收有关与代理的“系统”连接断开和重新建立的通知。例如,广播股票报价的股票报价服务可以在没有活动的“系统”连接时停止尝试发送消息。

默认情况下,STOMP 代理中继始终连接,并在连接丢失时根据需要重新连接到同一主机和端口。如果您希望提供多个地址,则可以在每次尝试连接时配置地址提供程序,而不是固定主机和端口。以下示例展示了如何执行此操作。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

	// ...

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

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

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