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 | ポータビリティが必要な場合 |
| メッセージブローカー | 高度なメッセージング機能 | 複雑なメッセージングが必要な場合 |