对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

消息的顺序

来自代理(broker)的消息会被发布到 clientOutboundChannel,然后从该通道写入 WebSocket 会话。由于该通道由一个 ThreadPoolExecutor 支撑,消息会在不同的线程中被处理,因此客户端接收到的消息顺序可能与发布的精确顺序不一致。spring-doc.cadn.net.cn

如果这是一个问题,请启用 setPreservePublishOrder 标志,如下例所示:spring-doc.cadn.net.cn

@Configuration
@EnableWebSocketMessageBroker
public class MyConfig implements WebSocketMessageBrokerConfigurer {

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

}

以下示例展示了与前述示例等效的 XML 配置:spring-doc.cadn.net.cn

<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,从而保证消息的发布顺序。 请注意,这会带来轻微的性能开销,因此仅在必要时才应启用此功能。spring-doc.cadn.net.cn