連線到訊息代理

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