连接到代理

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

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

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

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

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

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

  • Java

  • Kotlin

@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 属性配置 STOMP 代理中继器。此属性的值设置为每个CONNECT 框架的host 标头,并且可能很有用(例如,在云环境中,建立 TCP 连接的实际宿主机与提供基于云的 STOMP 服务的宿主机不同)。