連線至 Broker

STOMP broker relay 維護與 broker 的單一「系統」TCP 連線。此連線僅用於來自伺服器端應用程式的訊息,而非用於接收訊息。您可以為此連線組態 STOMP 憑證(即 STOMP frame loginpasscode header)。這在 XML namespace 和 Java 組態中都以 systemLoginsystemPasscode 屬性公開,預設值為 guestguest

STOMP broker relay 也會為每個連線的 WebSocket 客户端建立個別的 TCP 連線。您可以組態代表客户端建立的所有 TCP 連線所使用的 STOMP 憑證。這在 XML namespace 和 Java 組態中都以 clientLoginclientPasscode 屬性公開,預設值為 guestguest

STOMP broker relay 始終在代表客户端轉發到 broker 的每個 CONNECT frame 上設定 loginpasscode header。因此,WebSocket 客户端無需設定這些 header。它們會被忽略。如驗證章節所述,WebSocket 客户端應改為依賴 HTTP 驗證來保護 WebSocket 端點並建立客户端身分。

STOMP broker relay 也會透過「系統」TCP 連線,傳送和接收至訊息 broker 的心跳訊號。您可以組態傳送和接收心跳訊號的間隔(預設各為 10 秒)。如果與 broker 的連線遺失,broker relay 會持續嘗試重新連線,每 5 秒一次,直到成功為止。

任何 Spring bean 都可以實作 ApplicationListener<BrokerAvailabilityEvent>,以在與 broker 的「系統」連線遺失和重新建立時接收通知。例如,廣播股票報價的股票報價服務可以在沒有作用中的「系統」連線時停止嘗試傳送訊息。

預設情況下,STOMP broker relay 始終連線,並在連線遺失時根據需要重新連線,至相同的主機和埠。如果您希望提供多個位址,在每次嘗試連線時,您可以組態位址的供應器,而不是固定的主機和埠。以下範例示範如何執行此操作

  • 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 broker relay。此屬性的值會設定為每個 CONNECT frame 的 host header,並且可能很有用(例如,在雲端環境中,TCP 連線實際建立的主機與提供雲端 STOMP 服務的主機不同)。