Comment combiner le Spring-Data-Rest et le Spring Websocket en une seule implémentation

Je voudrais synchroniser l’état à tous les clients intéressés par des modifications d’entités particulières. Je voudrais donc réaliser quelque chose comme:

  • exposer l’API CRUD sur l’entité (via HTTP/REST et websockets )
  • et routage de la réponse (des appels de modification) au sujet des websockets

Donc, techniquement, je serais intéressé par des idées pour mélanger spring-données-repos avec mise en œuvre de spring Websockets pour réaliser quelque chose comme spring-données-websocket.

Il y a deux solutions qui me viennent à l’esprit et, en fait, les deux seraient:

  • spring-data-rest pour exposer mes entités via l’ REST/HTTP API
  • contrôleurs websocket (utilisés pour les appels de modification sur des entités)

Les contrôleurs websocket ressembleraient à ceci:

 @Controller public class EntityAWebSocketController { @MessageMapping("/EntityA/update") @SendTo("/topic/EntityA/update") public EntityA update(EntityA entityA) throws Exception { // persist,.... return entityA; } } 

Scénario 1: Websocket API appelée depuis l’ Websocket API REST/HTTP API

Règles:

  • la demande du client est toujours REST/HTTP API
  • la réponse est l’ REST/HTTP API pour toutes les opérations
  • En outre, pour la modification des opérations, le message websocket vient également

Techniquement, pourrait être réalisé par:

  • appel des contrôleurs websocket partir des événements spring-rest-data (notamment dans AfterCreateEvent , AfterSaveEvent , AfterLinkSaveEvent , AfterDeleteEvent )

Pourtant, la solution me semble assez difficile , car je devrais aller pour:

  1. client A – Requête HTTP -> Serveur (contrôleur de repos de données-spring)
  2. Serveur (AfterXXXEvent dans le contrôleur spring-data-rest) – message websocket -> contrôleur websocket
  3. Spring websocket controller – message websocket via le sujet -> tous les clients intéressés par le sujet
  4. Serveur (contrôleur de repos des données de spring) – Réponse HTTP -> client A

Scénario 2: Websocket API indépendante de l’ REST API

Règles:

  • la demande du client est l’ REST/HTTP API pour les opérations sans modification uniquement
  • La réponse est une REST/HTTP API pour les opérations sans modification uniquement.
  • le client envoie un message websocket pour toutes les opérations de modification
  • websocket message websocket est envoyé au client pour toutes les opérations de modification uniquement

Eh bien, si aucune autre idée ne se présentait, je choisirais la dernière, mais ce serait tout de même formidable si j’avais pu générer d’une manière ou d’une autre les méthodes C(R)UD exposées via les websockets , quelque chose comme Spring-Data-Websockets. et gérer uniquement les itinéraires dans mon implémentation.

Comme j’ai l’impression de devoir exposer manuellement (via *WebSocketController s) toutes les méthodes CUD de toutes mes entités. Et je pourrais être trop paresseux pour ça.

Des idées?

Le scénario 2 parle, dans la dernière étape, d’un seul client. Mais je pensais que votre exigence concernait un sujet puisque vous vouliez plusieurs clients. Si je voulais compléter 2 pour votre exigence indiquée, alors vous voudrez peut-être maintenir une liste de clients et implémenter votre propre queue ou utiliser un ForkJoinPool pour envoyer un message à tous vos clients écoutant sur votre WebSockets. Cela dit, un sujet est nettement plus élégant ici, mais son apparence est trop compliquée avec des interfaces différentes.

Pour tous les messages client à serveur, utilisez simplement un protocole filaire et utilisez une collection pour paramétrer, il pourrait s’agir de RParam1 …….

Sur le serveur, vous avez besoin d’un contrôleur pour les associer à différentes requêtes (et opérations). D’une certaine manière, cela ne ressemble pas à trop de travail. J’espère que cela t’aides.