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代理中繼始終保持連接,并在連接丟失時根據需要重新連接到相同的主機和端口。如果你希望提供多個地址,則在每次嘗試連接時,你可以配置一個地址提供者,而不是固定的主機和端口。以下示例展示了如何做到這一點:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {*// ...*@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableStompBrokerRelay("/queue/", "/topic/").setTcpClient(createTcpClient());registry.setApplicationDestinationPrefixes("/app");}private ReactorNettyTcpClient<byte[]> createTcpClient() {return new ReactorNettyTcpClient<>(client -> client.addressSupplier(() -> ... ),new StompReactorNettyCodec());}
}
你還可以使用virtualHost
屬性配置STOMP代理中繼。該屬性的值被設置為每個CONNECT
幀的host
標頭,這可能會很有用(例如,在云環境中,建立TCP連接的實際主機與提供基于云的STOMP服務的主機不同)。