连接到代理
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客户端无需设置这些头。它们会被忽略。正如身份验证部分所解释的那样,WebSocket客户端应依赖HTTP身份验证来保护WebSocket端点并建立客户端身份。 |
STOMP代理中继还通过“系统”TCP连接发送和接收心跳到代理之间的消息代理。您可以配置发送和接收心跳的间隔(默认为每个10秒)。如果与代理的连接丢失,代理中继将继续尝试重新连接,每5秒一次,直到成功。
任何Spring bean都可以实现ApplicationListener<BrokerAvailabilityEvent>以在与代理的“系统”连接丢失和重新建立时接收通知。例如,广播股票报价的股票报价服务可以在没有活动“系统”连接时停止尝试发送消息。
默认情况下,STOMP代理中继始终连接,并根据需要重新连接到相同的主机和端口。如果您希望在每次连接尝试时提供多个地址,可以配置地址供应商,而不是固定的主机和端口。以下示例显示了如何执行此操作:
@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服务的主机不同)。