インターセプト

イベントは、すべてのクライアントメッセージではなく、STOMP 接続のライフサイクルに関する通知を提供します。アプリケーションは、ChannelInterceptor を登録して、メッセージおよび処理チェーンの任意の部分をインターセプトすることもできます。次の例は、クライアントからの受信メッセージをインターセプトする方法を示しています。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void configureClientInboundChannel(ChannelRegistration registration) {
		registration.interceptors(new MyChannelInterceptor());
	}
}

次の例に示すように、カスタム ChannelInterceptor は StompHeaderAccessor または SimpMessageHeaderAccessor を使用してメッセージに関する情報にアクセスできます。

public class MyChannelInterceptor implements ChannelInterceptor {

	@Override
	public Message<?> preSend(Message<?> message, MessageChannel channel) {
		StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
		StompCommand command = accessor.getStompCommand();
		// ...
		return message;
	}
}

アプリケーションは、ExecutorChannelInterceptor を実装することもできます。ExecutorChannelInterceptor は、メッセージが処理されるスレッドでコールバックを使用する ChannelInterceptor のサブインターフェースです。ChannelInterceptor は、チャネルに送信されるメッセージごとに 1 回呼び出されますが、ExecutorChannelInterceptor は、チャネルからのメッセージをサブスクライブする各 MessageHandler のスレッドにフックを提供します。

前述の SessionDisconnectEvent と同様に、DISCONNECT メッセージはクライアントからのものであるか、WebSocket セッションが閉じられたときに自動的に生成されることに注意してください。場合によっては、インターセプターがセッションごとにこのメッセージを複数回インターセプトすることがあります。コンポーネントは、複数の切断イベントに関してべき等である必要があります。