消息顺序
来自 Broker 的消息会发布到 clientOutboundChannel
,然后从那里写入 WebSocket 会话。由于该通道由 ThreadPoolExecutor
提供支持,消息会在不同的线程中处理,因此客户端接收到的最终序列可能与发布的精确顺序不符。
要启用有序发布,请如下设置 setPreservePublishOrder
标志
-
Java
-
Kotlin
-
XML
@Configuration
@EnableWebSocketMessageBroker
public class PublishOrderWebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// ...
registry.setPreservePublishOrder(true);
}
}
@Configuration
@EnableWebSocketMessageBroker
class PublishOrderWebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun configureMessageBroker(registry: MessageBrokerRegistry) {
// ...
registry.setPreservePublishOrder(true)
}
}
<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
标志
-
Java
-
Kotlin
@Configuration
@EnableWebSocketMessageBroker
public class ReceiveOrderWebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.setPreserveReceiveOrder(true);
}
}
@Configuration
@EnableWebSocketMessageBroker
class ReceiveOrderWebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun registerStompEndpoints(registry: StompEndpointRegistry) {
registry.setPreserveReceiveOrder(true)
}
}