Mise en place d'un Système de Notification par Messages avec Spring Boot, Netty et WebSocket

Pour construire un système simple de notification par messages basé sur Spring Boot, Netty et WebSocket, suivez ces étapes.

  1. 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.

  1. 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> -->

  1. 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();
    }
}

  1. 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);
            }
        }
    }
}

  1. 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());
        }
    }
}

  1. 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);
    }
}

  1. 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>

  1. 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.

Étiquettes: Spring Boot WebSocket Netty Java Notification

Publié le 30 juillet à 18h18