websockets cliente java spring websocket spring-boot push-notification

java - cliente - Lanzamiento de websocket programado con Springboot



websocket java netbeans (2)

Soy un poco nuevo en primavera y primavera en general. Me metieron en un proyecto y mi primer "ejercicio" para mojarme los pies es crear una función de alimentación de noticias simple en la interfaz que se actualizará automáticamente a través de notificaciones push de websocket.

Las tecnologías involucradas son:

  • Angular para la aplicación de front-end general
  • SockJS para crear comunicación websocket
  • Stomp over webosocket para recibir mensajes de un intermediario de mensajes
  • Springboot Websockets
  • Stomp Message Broker (el marco relacionado con Java)

Lo que quiero lograr en el frente es:

  1. Crear una conexión websocket cuando se carga la vista
  2. Crear un proveedor de stomp usando ese websocket
  3. Haga que mi cliente se suscriba
  4. El servidor de captura envió mensajes y actualizó la vista angular

En cuanto al código del lado del servidor:

  1. Configura las cosas de websocket y administra la conexión
  2. Haga que el servidor inserte mensajes cada X cantidad de tiempo (a través de un ejecutor o @Scheduled ?).

Creo que he logrado todo hasta el momento, excepto la última parte del código del lado del servidor. El ejemplo que estaba siguiendo utiliza el websocket en modo dúplex completo y cuando un cliente envía algo, el servidor responde inmediatamente a la cola de mensajes y todos los clientes suscritos se actualizan. Pero lo que quiero es que el servidor envíe algo por encima de Stomp SIN esperar a que el cliente haga ninguna solicitud.

Al principio creé un @Controller primavera y agregué un método a él con la @SendTo("/my/subscribed/path") . Sin embargo, no tengo idea de cómo activarlo. También traté de agregar @Scheduled pero esta anotación solo funciona en los métodos con el tipo de retorno void (y estoy devolviendo un objeto NewsMessage).

Esencialmente, lo que necesito es que el cliente inicialice una conexión websocket, y luego haga que el servidor empiece a enviar mensajes a través de él en un intervalo establecido (o cada vez que se desencadena un evento, no importa por el momento). Además, cada cliente nuevo debe escuchar la misma cola de mensajes y recibir los mismos mensajes.


En primer lugar, necesita tener su websocket habilitado en primavera, antes de asegurarse de que tiene las dependencias de acuerdo en su pom.xml

Por ejemplo, el más importante:

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

Entonces necesitas tener tu configuración en su lugar. Te sugiero que comiences con un corredor simple.

@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"); } }

Entonces tu controlador debería verse así. Cuando su aplicación AngularJs abra la conexión en ''/ portfolio'' y envíe la suscripción a este canal /topic/greeeting , lo recibirá en el controlador y responderá a todos los usuarios suscritos.

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

En cuanto a la pregunta del programador, debe habilitarla a través de la configuración:

@Configuration @EnableScheduling public class SchedulerConfig{}

Y luego programarlo:

@Component public class ScheduledUpdatesOnTopic{ @Autowired private SimpMessagingTemplate template; @Scheduler(fixedDelay=300) public void publishUpdates(String text){ template.convertAndSend("/topic/greetings", text); } }

Espero que este concepto de alguna manera aclarado y los pasos necesarios para que las cosas funcionen para usted.


En primer lugar, no puede enviar mensajes (push) a los clientes sin sus suscripciones.

En segundo lugar, para enviar mensajes a todos los suscriptores, debe echar un vistazo al topic abstracción del topic .

Eso es un fundamento de STOMP.

Creo que está bien con @Scheduled , pero solo necesita inyectar SimpMessagingTemplate para enviar mensajes al agente de STOMP para que lo envíe posteriormente.

Consulte también la configuración de Spring WebSockets XML que no proporciona brokerMessagingTemplate