消息顺序
来自代理的消息发布到 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);
}
}