Pour construire un système simple de notification par messages basé sur Spring Boot, Netty et WebSocket, suivez ces étapes.
- Initialisation du projet Spring Boot
Démarrez un nouveau projet Spring Boot à l'aide de Spring Initializr ou manuellement. Assurez-vous d'inclure les dépendances nécessaires.
- Ajout des dépendances
Modifiez votre fichier pom.xml pour intégrer les bibliothèques WebSocket et Netty :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Netty est souvent inclus implicitement par d'autres dépendances,
mais peut être ajouté explicitement si nécessaire. -->
<!-- <dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency> -->
- Configuraton WebSocket
Créez une classe de configuration pour gérer le comportement de votre serveur WebSocket.
@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(notificationHandler(), "/notifications")
.setAllowedOrigins("*"); // Permettre les connexions depuis n'importe quelle origine (à ajuster en production)
}
@Bean
public WebSocketHandler notificationHandler() {
return new NotificationWebSocketHandler();
}
}
- Implémentation du gestionnaire WebSocket
Déveolppez une classe qui hérite de TextWebSocketHandler pour traiter les événements liés aux WebSockets.
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArrayList;
public class NotificationWebSocketHandler extends TextWebSocketHandler {
private final CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
System.out.println("Client connecté: " + session.getId());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String receivedMessage = message.getPayload();
System.out.println("Message reçu de " + session.getId() + ": " + receivedMessage);
// Exemple : Renvoyer le message à l'expéditeur ou le diffuser
// session.sendMessage(new TextMessage("Echo: " + receivedMessage));
}
@Override
public void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception {
sessions.remove(session);
System.out.println("Client déconnecté: " + session.getId());
}
public void broadcastMessage(String message) throws IOException {
TextMessage textMessage = new TextMessage(message);
for (WebSocketSession session : sessions) {
if (session.isOpen()) {
session.sendMessage(textMessage);
}
}
}
}
- Création du contrôleur API
Mettez en place un contrôleur Spring MVC pour permettre l'envoi de notifications via des requêtes HTTP.
@RestController
@RequestMapping("/api/notify")
public class NotificationController {
private final NotificationWebSocketHandler webSocketHandler;
public NotificationController(NotificationWebSocketHandler webSocketHandler) {
this.webSocketHandler = webSocketHandler;
}
@PostMapping("/broadcast")
public ResponseEntity<String> broadcastNotification(@RequestBody String notificationMessage) {
try {
webSocketHandler.broadcastMessage(notificationMessage);
return ResponseEntity.ok("Notification envoyée à tous les clients connectés.");
} catch (IOException e) {
// Gérer l'erreur d'envoi
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Erreur lors de l'envoi de la notification : " + e.getMessage());
}
}
}
- Point d'entrée de l'application
Assurez-vous que votre classe principale de l'application Spring Boot est configurée pour lancer le serveur.
@SpringBootApplication
public class NotificationApp {
public static void main(String[] args) {
SpringApplication.run(NotificationApp.class, args);
}
}
- Interface client (HTML/JavaScript)
Créez une page web simple pour tester la connexion et la réception des messages WebSocket.
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Client WebSocket de Notification</title>
</head>
<body>
<h1>Notifications en temps réel</h1>
<div id="messages"></div>
<script>
// Assurez-vous que l'URL correspond à votre configuration WebSocket
const socketUrl = "ws://localhost:8080/notifications";
const socket = new WebSocket(socketUrl);
socket.onopen = function(event) {
console.log("Connexion WebSocket établie.");
displayMessage("Connecté au serveur de notification.");
};
socket.onmessage = function(event) {
const message = event.data;
console.log("Message reçu : " + message);
displayMessage("Notification : " + message);
};
socket.onclose = function(event) {
console.log("Connexion WebSocket fermée.");
displayMessage("Déconnecté du serveur.");
};
socket.onerror = function(event) {
console.error("Erreur WebSocket : ", event);
displayMessage("Erreur de connexion WebSocket.");
};
function displayMessage(msg) {
const messageDiv = document.getElementById('messages');
const p = document.createElement('p');
p.textContent = msg;
messageDiv.appendChild(p);
}
</script>
</body>
</html>
- Test du système
Lancez votre application Spring Boot. Ouvrez la page HTML dans votre navigateur pour établir la connexion WebSocket. Ensuite, utilisez un outil comme curl ou Postman pour envoyer une requête POST à l'endpoint /api/notify/broadcast avec un message JSON pour tester la diffusion.
# Exemple avec curl
curl -X POST http://localhost:8080/api/notify/broadcast -H "Content-Type: application/json" -d '"Ceci est un test de diffusion"'
Vous devriez voir le message apparaître dans la console du serveur et sur la page web du client.