インターセプト
イベントは、すべてのクライアントメッセージではなく、STOMP 接続のライフサイクルに関する通知を提供します。アプリケーションは、ChannelInterceptor
を登録して、メッセージおよび処理チェーンの任意の部分をインターセプトすることもできます。次の例は、クライアントからの受信メッセージをインターセプトする方法を示しています。
Java
Kotlin
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new MyChannelInterceptor());
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun configureClientInboundChannel(registration: ChannelRegistration) {
registration.interceptors(MyChannelInterceptor())
}
}
次の例に示すように、カスタム ChannelInterceptor
は StompHeaderAccessor
または SimpMessageHeaderAccessor
を使用してメッセージに関する情報にアクセスできます。
Java
Kotlin
public class MyChannelInterceptor implements ChannelInterceptor {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
StompCommand command = accessor.getCommand();
// ...
return message;
}
}
class MyChannelInterceptor : ChannelInterceptor {
override fun preSend(message: Message<*>, channel: MessageChannel): Message<*> {
val accessor = StompHeaderAccessor.wrap(message)
val command = accessor.command
// ...
return message
}
}
アプリケーションは、ExecutorChannelInterceptor
を実装することもできます。ExecutorChannelInterceptor
は、メッセージが処理されるスレッドでコールバックを使用する ChannelInterceptor
のサブインターフェースです。ChannelInterceptor
は、チャネルに送信されるメッセージごとに 1 回呼び出されますが、ExecutorChannelInterceptor
は、チャネルからのメッセージをサブスクライブする各 MessageHandler
のスレッドにフックを提供します。
前述の SessionDisconnectEvent
と同様に、DISCONNECT メッセージはクライアントからのものであるか、WebSocket セッションが閉じられたときに自動的に生成されることに注意してください。場合によっては、インターセプターがセッションごとにこのメッセージを複数回インターセプトすることがあります。コンポーネントは、複数の切断イベントに関してべき等である必要があります。