連線到代理

STOMP 訊息代理中繼器維護一個到訊息代理的單一“系統”TCP 連線。此連線僅用於伺服器端應用程式發出的訊息,而不用於接收訊息。您可以為此連線配置 STOMP 憑據(即 STOMP 幀的 loginpasscode 頭部)。在 XML 名稱空間和 Java 配置中,這都以 systemLoginsystemPasscode 屬性的形式公開,預設值均為 guest

STOMP 訊息代理中繼器還會為每個連線的 WebSocket 客戶端建立一個單獨的 TCP 連線。您可以配置用於代表客戶端建立的所有 TCP 連線的 STOMP 憑據。在 XML 名稱空間和 Java 配置中,這都以 clientLoginclientPasscode 屬性的形式公開,預設值均為 guest

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 服務的主機不同)。

© . This site is unofficial and not affiliated with VMware.