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