连接到代理
STOMP 消息代理中继器维护一个到消息代理的单一“系统”TCP 连接。此连接仅用于服务器端应用程序发出的消息,而不用于接收消息。您可以为此连接配置 STOMP 凭据(即 STOMP 帧的 login 和 passcode 头部)。在 XML 命名空间和 Java 配置中,这都以 systemLogin 和 systemPasscode 属性的形式公开,默认值均为 guest。
STOMP 消息代理中继器还会为每个连接的 WebSocket 客户端创建一个单独的 TCP 连接。您可以配置用于代表客户端创建的所有 TCP 连接的 STOMP 凭据。在 XML 命名空间和 Java 配置中,这都以 clientLogin 和 clientPasscode 属性的形式公开,默认值均为 guest。
STOMP 消息代理中继器始终在它代表客户端转发到消息代理的每个 CONNECT 帧上设置 login 和 passcode 头部。因此,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 服务的主机不同)。