10 votes

comment attendre les abonnements établis ?

J'ai le code js suivant :

stompClient.subscribe('/topic/clients', function (calResult) {
    updateClientsTable(JSON.parse(calResult.body));
});
$.get("/clients", null);

et le code serveur suivant (la dernière ligne l'invoque) :

 @GetMapping(value = {"/clients"})
 @ResponseBody
 public void loadClients() {
      brokerMessagingTemplate.convertAndSend("/topic/clients", clientService.getClientList());
 }

Parfois, le front-end rate le résultat de $.get("/clients", null);

Si je comprends bien le problème : au moment où le résultat est obtenu sur le front-end, les abonnements ne se produisent pas.

si pour mettre $.get("/clients", null); ci-dessous dans le code - tout fonctionne bien.

Pouvez-vous expliquer comment attendre les abonnements établis ?

1voto

light_303 Points 1045

Je pense qu'il serait plus logique de ne pas mélanger les requêtes REST avec ce modèle de messagerie.

Avez-vous envisagé d'envoyer la commande "updateClients" via SockJS dans un canal "/apps/updateClients" qui répond au canal "/topic/clients" ?

1voto

berserkk Points 802

Comme @light_303 l'a déjà mentionné, mélanger les requêtes HTTP avec le mécanisme de notification n'est pas bon. Vous pouvez enregistrer un moment, lorsque le client se connecte (requête GET sur /clients ), mais vous ne pouvez pas vous enregistrer quand il se déconnecte.

Vous devez penser de l'une des manières suivantes. Lorsque l'utilisateur s'abonne à /topic/clients :

  1. Vous lui envoyez individuellement une réponse avec la liste de tous les clients, puis vous ne faites que des mises à jour.
  2. Vous lui envoyez individuellement l'heure actuelle du serveur ou une sorte d'ID, puis vous ne faites que pousser les mises à jour. L'utilisateur utilise l'heure et l'ID donnés dans une demande GET pour /clients et reçoit la liste complète des clients à ce moment-là. Cette option peut être utile dans les situations où vous effectuez des mises à jour incrémentielles (c'est-à-dire lorsque vous ajoutez de nouveaux éléments à la liste), mais pas dans les autres cas.

Vérifiez cette question : Envoi d'un message à un utilisateur spécifique sur Spring Websocket .

C'est vraiment ridicule, comment le printemps peut compliquer les choses. Je vous recommande de vous tourner vers d'autres frameworks pour la communication web en temps réel, comme Vert.x ou Netty et vers le langage de programmation Go. Utilisez WebSockets ou SockJS au lieu de STOMP. Toutes ces technologies peuvent vous donner une solution plus flexible et plus performante de manière évidente. Vérifiez également Centrifugo projet, peut-être que c'est pertinent pour votre tâche.

0voto

Oleg Kurbatov Points 1144

Vous pouvez utiliser @SubscribeMapping de l'annotation spring-messaging .

Si vous avez spring-messaging configuré comme décrit aquí y aquí le code côté serveur pourrait ressembler à ce qui suit :

@Controller
public class MessagingController {
    @SubscribeMapping("/clients")
    public List<Client> loadClients() {
        return clientService.getClientList();
    }
}

De cette façon, vous n'avez pas à appeler $.get("/clients", null); car le gestionnaire de messages JS reçoit le résultat de loadClients() appeler juste après que la souscription ait eu lieu. Le code JS ressemblerait à ceci :

stompClient.subscribe('/topic/clients', function (calResult) {
    updateClientsTable(JSON.parse(calResult.body));
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X