Order of Messages

    来自消息代理的消息被发布到客户端 OutboundChannel,在那里它们被写入WebSocket 会话。由于该通道由ThreadPoolExecutor 支持,消息在不同的线程中被处理,客户端收到的结果序列可能与发布的确切顺序不一致。

    如果这是一个问题,请启用 setPreservePublishOrder标志,如下例所示:

    1. @Configuration
    2. @EnableWebSocketMessageBroker
    3. public class MyConfig implements WebSocketMessageBrokerConfigurer {
    4. @Override
    5. protected void configureMessageBroker(MessageBrokerRegistry registry) {
    6. // 客户端是否必须按发布顺序接收消息。
    7. // 默认情况下,发送到"clientOutboundChannel"的消息可能不会以相同的顺序处理,因为该通道由 ThreadPoolExecutor 支持,而 ThreadPoolExecutor 又不保证按顺序处理。
    8. // 当此标志设置为true时,同一会话中的消息将一次发送到"clientOutboundChannel" ,以保持发布顺序。仅在需要时启用此功能,因为保持消息有序会产生一些性能开销
    9. // ...
    10. registry.setPreservePublishOrder(true);
    11. }
    12. }

    下面是 XML 的配置

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:websocket="http://www.springframework.org/schema/websocket"
    4. xsi:schemaLocation="
    5. http://www.springframework.org/schema/beans
    6. https://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/websocket
    8. https://www.springframework.org/schema/websocket/spring-websocket.xsd">
    9. <websocket:message-broker preserve-publish-order="true">
    10. <!-- ... -->
    11. </websocket:message-broker>
    12. </beans>

    当该标志被设置时,同一客户会话中的消息会被一个一个地发布到 clientOutboundChannel 上,这样就保证了发布的顺序。请注意,这将产生一个小的性能开销,所以你应该只在需要时才启用它。