メッセージの順序

ブローカーからのメッセージは 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>

フラグが設定されると、同じクライアントセッション内のメッセージが 1 つずつ 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)
	}
}