訊息順序

來自 Broker 的訊息會發布到 clientOutboundChannel,然後從那裡寫入 WebSocket 會話。由於該通道由 ThreadPoolExecutor 提供支援,訊息會在不同的執行緒中處理,因此客戶端接收到的最終序列可能與釋出的精確順序不符。

要啟用有序釋出,請如下設定 setPreservePublishOrder 標誌

  • Java

  • Kotlin

  • XML

@Configuration
@EnableWebSocketMessageBroker
public class PublishOrderWebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		// ...
		registry.setPreservePublishOrder(true);
	}

}
@Configuration
@EnableWebSocketMessageBroker
class PublishOrderWebSocketConfiguration : WebSocketMessageBrokerConfigurer {

	override fun configureMessageBroker(registry: MessageBrokerRegistry) {
		// ...
		registry.setPreservePublishOrder(true)
	}
}
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:websocket="http://www.springframework.org/schema/websocket"
	   xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/websocket
		https://www.springframework.org/schema/websocket/spring-websocket.xsd">

	<websocket:message-broker preserve-publish-order="true">
		<!-- ... -->
	</websocket:message-broker>

</beans>

設定此標誌後,同一客戶端會話中的訊息將一次一個地釋出到 clientOutboundChannel,從而保證釋出順序。請注意,這會帶來少量效能開銷,因此僅在需要時啟用。

客戶端傳送的訊息也同樣適用,它們會被髮送到 clientInboundChannel,然後根據目的地字首進行處理。由於該通道由 ThreadPoolExecutor 提供支援,訊息會在不同的執行緒中處理,因此處理的最終序列可能與接收時的精確順序不符。

要啟用有序接收,請如下設定 setPreserveReceiveOrder 標誌

  • Java

  • Kotlin

@Configuration
@EnableWebSocketMessageBroker
public class ReceiveOrderWebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.setPreserveReceiveOrder(true);
	}
}
@Configuration
@EnableWebSocketMessageBroker
class ReceiveOrderWebSocketConfiguration : WebSocketMessageBrokerConfigurer {

	override fun registerStompEndpoints(registry: StompEndpointRegistry) {
		registry.setPreserveReceiveOrder(true)
	}
}