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