连接到消息代理

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