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

连接到消息代理

STOMP 代理中继与代理保持一个“系统”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 代理始终在它代表客户端转发到代理的每个 CONNECT 帧上设置 loginpasscode 头。因此,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 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 服务的主机不同时)。spring-doc.cadn.net.cn