此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

连接到代理

STOMP 代理中继维护与代理的单个“系统”TCP 连接。 此连接用于源自服务器端应用程序的邮件 仅用于接收消息。您可以配置 STOMP 凭证(即 STOMP 框架loginpasscodeheaders) 来建立此连接。这暴露了 在 XML 命名空间和 Java 配置中作为systemLoginsystemPasscode默认值为guestguest.spring-doc.cadn.net.cn

STOMP 代理中继还为每个连接的 TCP 创建单独的 TCP 连接 WebSocket 客户端。您可以配置用于所有 TCP 的 STOMP 凭证 代表客户端创建的连接。这在 XML 命名空间中都公开 和 Java 配置作为clientLoginclientPasscode属性 值guestguest.spring-doc.cadn.net.cn

STOMP 代理中继始终将loginpasscode每个CONNECT它代表客户转发给经纪人的框架。因此,WebSocket 客户端 不需要设置这些标头。他们被忽略了。正如身份验证部分所解释的,WebSocket 客户端应该依赖 HTTP 身份验证来保护 WebSocket 端点并建立客户端身份。

STOMP 代理中继还向消息发送和接收检测信号 通过“系统”TCP 连接进行代理。您可以配置发送间隔 并接收心跳(默认情况下每个 10 秒)。如果连接到代理 丢失时,代理中继继续尝试重新连接,每 5 秒一次, 直到它成功。spring-doc.cadn.net.cn

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

默认情况下,STOMP 代理中继始终连接,并在以下情况下根据需要重新连接 与同一主机和端口的连接丢失。如果您希望提供多个地址, 每次尝试连接时,您可以配置地址的提供商,而不是 固定主机和端口。以下示例显示了如何执行此作:spring-doc.cadn.net.cn

@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());
	}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {

	// ...

	override fun configureMessageBroker(registry: MessageBrokerRegistry) {
		registry.enableStompBrokerRelay("/queue/", "/topic/").setTcpClient(createTcpClient())
		registry.setApplicationDestinationPrefixes("/app")
	}

	private fun createTcpClient(): ReactorNettyTcpClient<ByteArray> {
		return ReactorNettyTcpClient({ it.addressSupplier { InetSocketAddress(0) } }, StompReactorNettyCodec())
	}
}

您还可以使用virtualHost财产。 此属性的值设置为host每个CONNECT框架 并且可能很有用(例如,在云环境中,实际主机 建立的 TCP 连接与提供 基于云的 STOMP 服务)。spring-doc.cadn.net.cn