连接到代理

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代理中继始终连接,并根据需要重新连接到相同的主机和端口。如果您希望在每次连接尝试时提供多个地址,可以配置地址供应商,而不是固定的主机和端口。以下示例显示了如何执行此操作:

@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服务的主机不同)。