消息顺序

来自代理的消息被发布到 clientOutboundChannel,然后写入到 WebSocket 会话中。由于通道由 ThreadPoolExecutor 支持,消息在不同的线程中处理,客户端接收的结果顺序可能与发布顺序不完全匹配。

要启用有序发布,请按照以下方式设置 setPreservePublishOrder 标志:

@Configuration
@EnableWebSocketMessageBroker
public class MyConfig implements WebSocketMessageBrokerConfigurer {

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

}

以下示例显示了前面示例的 XML 配置等效项:

<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 标志:

@Configuration
@EnableWebSocketMessageBroker
public class MyConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.setPreserveReceiveOrder(true);
	}
}