連線至 Broker
STOMP broker relay 維護與 broker 的單一「系統」TCP 連線。此連線僅用於來自伺服器端應用程式的訊息,而非用於接收訊息。您可以為此連線組態 STOMP 憑證(即 STOMP frame login
和 passcode
header)。這在 XML namespace 和 Java 組態中都以 systemLogin
和 systemPasscode
屬性公開,預設值為 guest
和 guest
。
STOMP broker relay 也會為每個連線的 WebSocket 客户端建立個別的 TCP 連線。您可以組態代表客户端建立的所有 TCP 連線所使用的 STOMP 憑證。這在 XML namespace 和 Java 組態中都以 clientLogin
和 clientPasscode
屬性公開,預設值為 guest
和 guest
。
STOMP broker relay 始終在代表客户端轉發到 broker 的每個 CONNECT frame 上設定 login 和 passcode 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 服務的主機不同)。