对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

连接到代理

STOMP 代理中继(broker relay)会与代理维持一个单一的“系统”TCP 连接。 该连接仅用于源自服务器端应用程序的消息,而不用于接收消息。你可以为该连接配置 STOMP 凭据(即 STOMP 帧中的 loginpasscode 头部)。 在 XML 命名空间和 Java 配置中,这分别通过 systemLoginsystemPasscode 属性进行设置,默认值均为 guestguestspring-doc.cadn.net.cn

STOMP 代理中继还会为每个已连接的 WebSocket 客户端创建一个独立的 TCP 连接。您可以配置用于代表客户端创建的所有 TCP 连接的 STOMP 凭据。在 XML 命名空间和 Java 配置中,这分别通过 clientLoginclientPasscode 属性进行暴露,默认值均为 guestguestspring-doc.cadn.net.cn

STOMP代理中继(broker relay)在代表客户端转发给代理的每一个 login 帧上,始终会设置 passcodeCONNECT 头部。因此,WebSocket 客户端无需设置这些头部,它们会被忽略。正如认证一节所解释的那样,WebSocket 客户端应依赖 HTTP 认证来保护 WebSocket 端点并建立客户端身份。

STOMP代理中继还会通过“系统”TCP连接向消息代理发送和接收心跳。您可以配置发送和接收心跳的时间间隔(默认均为10秒)。如果与代理的连接丢失,代理中继会每5秒尝试重新连接一次,直到连接成功为止。spring-doc.cadn.net.cn

任何 Spring Bean 都可以实现 ApplicationListener<BrokerAvailabilityEvent>, 以便在与代理(broker)的“系统”连接断开并重新建立时接收通知。例如,一个广播股票行情的服务可以在没有活跃的“系统”连接时停止尝试发送消息。spring-doc.cadn.net.cn

默认情况下,STOMP 代理中继始终连接到同一个主机和端口,并在连接丢失时按需重新连接。如果你希望在每次尝试连接时提供多个地址,可以配置一个地址供应器(supplier of addresses),而不是使用固定的主机和端口。以下示例展示了如何实现这一点:spring-doc.cadn.net.cn

@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 代理中继。 该属性的值将被设置为每个 host 帧的 CONNECT 头, 这在某些场景下非常有用(例如在云环境中,建立 TCP 连接的实际主机与提供 基于云的 STOMP 服务的主机不同)。spring-doc.cadn.net.cn