Spring FrameworkにおけるWebSocket通信の実装方法

Spring FrameworkでWebSocket通信を実装する手法

WebSocketはHTML5で標準化された双方向通信技術で、クライアントとサーバー間のリアルタイム通信を実現します。Spring Frameworkでは以下の3つの方法でWebSocketを実装できます。

1. 低レベルWebSocket APIの利用

Springが提供する低レベルAPIを使用して実装する方法です。WebSocketHandlerインターフェースを実装します。


public class CustomSocketHandler extends TextWebSocketHandler {
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        System.out.println("接続確立");
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) {
        System.out.println("受信メッセージ: " + message.getPayload());
    }
}

XML設定例:


<websocket:handlers>
    <websocket:mapping path="/ws/chat" handler="customHandler"/>
</websocket:handlers>

<bean id="customHandler" class="com.example.CustomSocketHandler"/>

2. JSR-356標準APIの利用

Java標準のWebSocket APIを使用する方法です。@ServerEndpointアノテーションを使用します。


@ServerEndpoint(value="/chat/{roomId}", 
                configurator = SpringConfigurator.class)
public class ChatEndpoint {
    
    @OnOpen
    public void onOpen(Session session, 
                      @PathParam("roomId") String roomId) {
        // 接続処理
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // メッセージ処理
    }
}

3. メッセージブローカーの利用

Springのメッセージブローカー機能を活用する方法です。STOMPプロトコルを使用します。


@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

クライアント側のJavaScript例:


const socket = new SockJS('/ws');
const stompClient = Stomp.over(socket);

stompClient.connect({}, function(frame) {
    stompClient.subscribe('/topic/messages', function(message) {
        console.log('受信: ' + message.body);
    });
});

各方式の比較

方式 特徴 使用ケース
低レベルAPI 細かい制御が可能 シンプルな実装が必要な場合
JSR-356 標準API ポータビリティが必要な場合
メッセージブローカー 高度なメッセージング機能 複雑なメッセージングが必要な場合

タグ: Spring-WebSocket JSR356 STOMP SockJS

7月19日 18:14 投稿