41 votes

Push websocket planifié avec Springboot

Je suis un peu nouveau pour le printemps-démarrage et au printemps en général. Je me suis jeté dans un projet et mon premier "exercice" afin d'obtenir mes pieds dans l'eau est de créer un simple flux de nouvelles sur la fin qui sera automatiquement mise à jour par le biais de websocket de notifications push.

Les technologies concernées sont les suivantes:

  • Angulaire pour le général avant la fin de l'application
  • SockJS pour la création d'une communication websocket
  • Stomp sur webosocket pour la réception de messages à partir d'un message broker
  • Springboot Websockets
  • Stomp Message Broker (java cadre)

Ce que je veux réaliser sur la face avant est:

  1. Créer une connexion websocket lorsque la vue est chargé
  2. Créer s stomp fournisseur de l'aide que websocket
  3. Avoir mon client m'y abonner
  4. Catch serveur poussé des messages et de mettre à jour l'angle de vue

Aussi loin que le côté serveur de code:

  1. Configurer le websocket trucs et gérer la connexion
  2. Le serveur de pousser des messages toutes les X temps (par le biais d'un exécuteur testamentaire ou l' @Scheduled?).

Je pense que j'ai réussi tout ce que jusqu'à présent, sauf la dernière partie du code côté serveur. L'exemple, j'ai été suivant utilise le websocket en mode duplex intégral et lorsqu'un client envoie quelque chose, alors le serveur répond immédiatement à la file d'attente de messages et tous souscrit mise à jour des clients. Mais ce que je veux, c'est pour le serveur lui-même envoyer quelque chose de plus Stomp SANS attente pour le client de présenter la demande.

Au début, j'ai créé un ressort @Controller et ajouté une méthode pour il avec @SendTo("/my/subscribed/path") d'annotation. Cependant, je n'ai aucune idée de comment le déclencher. Aussi j'ai essayé d'ajouter @Scheduled mais cette annotation ne fonctionne que sur les méthodes avec void type de retour (et je suis de retour d'un NewsMessage objet).

Essentiellement, ce que j'ai besoin est d'avoir le client initialiser une connexion websocket, et après que le serveur soit de commencer à pousser des messages à travers elle à un intervalle défini (ou chaque fois qu'un événement est déclenché, il n'est pas question pour l'instant). Aussi, chaque nouveau client doit d'écouter la même file d'attente de messages et de recevoir les mêmes messages.

46voto

Rafik991 Points 1586

Tout d'abord, vous devez tho votre websocket activé au printemps, avant assurez-vous d'avoir en fonction des dépendances dans votre pom.xml

Par exemple, la plus importante:

         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

Ensuite, vous devez avoir votre configuration en place. Je vous suggère de commencer avec de simples courtier.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/app");
        config.enableSimpleBroker("/topic", "/queue");
    }

}

Ensuite, votre contrôleur devrait ressembler à ceci. Quand votre AngularJs application va ouvrir une connexion sur '/portefeuille " et de l'envoyer abonnement à ce canal /topic/greeeting vous recevrez ce contrôleur et de répondre à tous les utilisateurs auxquels vous êtes abonnés.

@Controller
public class GreetingController {

    @MessageMapping("/greeting")
    public String handle(String greeting) {
        return "[" + getTimestamp() + ": " + greeting;
    }
}

Concernant votre planificateur de question, vous devez l'activer via la configuration:

@Configuration
@EnableScheduling
public class SchedulerConfig{}

Et puis à l'horaire:

@Component
public class ScheduledUpdatesOnTopic{

    @Autowired
    private SimpMessagingTemplate template;

    @Scheduler(fixedDelay=300)
    public void publishUpdates(String text){
        template.convertAndSend("/topic/greetings", text);
    }
}

Espérons que cela en quelque sorte précisé concept et des mesures doivent être prises pour rendre les choses fonctionnent pour vous.

10voto

Artem Bilan Points 8828

Tout d'abord, vous ne pouvez pas envoyer (push) des messages à des clients sans leur abonnement.

Deuxièmement, pour envoyer des messages à tous les abonnés, vous devriez jeter un oeil à l' topic d'abstraction de côté.

C'est un des fondamentaux de STOMP.

Je pense que vous êtes très bien avec @Scheduled, mais vous avez juste besoin d'injecter SimpMessagingTemplate pour envoyer des messages à l'amortisseur de courtier pour le pousser par la suite.

Voir aussi le Printemps WebSockets de configuration XML de ne pas fournir brokerMessagingTemplate

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