连接到代理服务器
一个 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 客户端不需要设置这些头。它们会被忽略。正如 Authentication 部分所解释的,WebSocket 客户端应依赖 HTTP 认证来保护 WebSocket 端点并建立客户端身份。
STOMP 代理中继还通过“系统” TCP 连接向消息代理发送和接收心跳。您可以配置发送和接收心跳的间隔(默认每个 10 秒)。如果与代理的连接丢失,代理中继将继续尝试每 5 秒重新连接,直到成功为止。
任何 Spring bean 都可以实现 ApplicationListener<BrokerAvailabilityEvent>
以接收通知,当与 broker 的“系统”连接丢失并重新建立时。例如,一个广播股票报价的股票报价服务可以在没有活动的“系统”连接时停止尝试发送消息。
默认情况下,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 服务的主机不同)。