連線到訊息代理
STOMP 訊息代理中繼維護到訊息代理的單個“系統”TCP 連線。此連線僅用於源自伺服器端應用程式的訊息,不用於接收訊息。你可以配置此連線的 STOMP 憑據(即 STOMP 幀的 login
和 passcode
頭)。這在 XML 名稱空間和 Java 配置中都公開為 systemLogin
和 systemPasscode
屬性,預設值分別為 guest
和 guest
。
STOMP 訊息代理中繼還會為每個已連線的 WebSocket 客戶端建立一個單獨的 TCP 連線。你可以配置代表客戶端建立的所有 TCP 連線所使用的 STOMP 憑據。這在 XML 名稱空間和 Java 配置中都公開為 clientLogin
和 clientPasscode
屬性,預設值分別為 guest
和 guest
。
STOMP 訊息代理中繼始終會在代表客戶端轉發到訊息代理的每個 CONNECT 幀上設定 login 和 passcode 頭。因此,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 服務的主機不同)。