SpringBootで点対点メッセージ送信を実現する方法は何ですか?
Spring Bootでは、WebSocketを使用して点対点でメッセージを送信することができます。WebSocketは、単一のTCP接続での双方向通信を可能にするプロトコルであり、Webブラウザとサーバー間で持続的な接続を確立し、サーバーがクライアントにデータをプッシュできるようにします。
Spring Bootを使用してメッセージの点対点送信を実装する手順は次のとおりです:
- ポムXML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- WebSocketの設定クラスを作成してください:WebSocketに関連する情報を設定するための設定クラスを作成してください。以下に例を示します:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/ws").setAllowedOrigins("*");
}
}
上記の例のコードでは、WebSocketHandler()はカスタムのWebSocketハンドラであり、/wsはWebSocketのエンドポイントのパスです。
- WebSocketハンドラーを作成する:WebSocket接続の確立、終了、およびメッセージ送信を処理するカスタムWebSocketハンドラーを作成します。以下にサンプルコードを示します。
public class WebSocketHandler extends TextWebSocketHandler {
private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// 处理收到的消息
for (WebSocketSession s : sessions) {
s.sendMessage(message);
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
}
上記のコード例では、WebSocketの接続が確立された後にafterConnectionEstablished()メソッドが呼び出され、handleTextMessage()メソッドが受信したテキストメッセージを処理するために使用され、WebSocketの接続が閉じられた後にafterConnectionClosed()メソッドが呼び出されます。
- Controllerクラスを作成してください:WebSocketに関連するリクエストを処理するためのControllerクラスを作成してください。以下にサンプルコードを示します。
@RestController
@RequestMapping("/api")
public class MessageController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@PostMapping("/send/{userId}")
public void sendMessage(@PathVariable("userId") String userId, @RequestBody String message) {
messagingTemplate.convertAndSendToUser(userId, "/ws", message);
}
}
上記のサンプルコードでは、sendMessage()メソッドが特定のWebSocket接続先にメッセージを送信するために使用されています。
ここまで、ポイント・ツー・ポイントでのメッセージ送信の実装が完了しました。メッセージを送信するには、POSTリクエストを/api/send/{userId}に送信し、userIdとmessageのパラメータを渡してください。
上記の例は、単純な一対一のメッセージ送信の実装方法を示しているだけであり、実際のアプリケーションでは、具体的な要件に基づいてさらなる開発や最適化が必要になる場合があります。