websockets messagemapping example baeldung java spring websocket stomp sockjs

java - messagemapping - websocket config spring



Variables de ruta en Spring WebSockets @SendTo mapping (1)

Aunque @MessageMapping admite marcadores de posición, no están expuestos / resueltos en los destinos @SendTo . Actualmente, no hay forma de definir destinos dinámicos con la anotación @SendTo (consulte el número SPR-12170 ). Podría usar SimpMessagingTemplate por el momento (así es como funciona internamente). Así es como lo harías:

@MessageMapping("/fleet/{fleetId}/driver/{driverId}") public void simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) { simpMessagingTemplate.convertAndSend("/topic/fleet/" + fleetId, new Simple(fleetId, driverId)); }

En su código, el destino '' / topic / fleet / {fleetId} '' se trata como un literal, esa es la razón por la cual la suscripción funciona, simplemente porque está enviando al mismo destino exacto.

Si solo desea enviar algunos datos iniciales específicos del usuario, puede devolverlos directamente en la suscripción:

@SubscribeMapping("/fleet/{fleetId}/driver/{driverId}") public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) { return new Simple(fleetId, driverId); }

Actualización: en Spring 4.2, los marcadores de posición de variable de destino son compatibles, ahora es posible hacer algo como:

@MessageMapping("/fleet/{fleetId}/driver/{driverId}") @SendTo("/topic/fleet/{fleetId}") public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) { return new Simple(fleetId, driverId); }

Tengo, lo que creo que es, una aplicación Spring WebSocket muy simple. Sin embargo, estoy tratando de usar variables de ruta para la suscripción, así como la asignación de mensajes.

He publicado un ejemplo parafraseado a continuación. Esperaría que la anotación @SendTo volviera a los suscriptores según su fleetId . es decir, un POST para /fleet/MyFleet/driver/MyDriver debe notificar a los suscriptores de /fleet/MyFleet , pero no veo este comportamiento.

Vale la pena señalar que funciona la suscripción a literal /fleet/{fleetId} . ¿Esto es intencionado? ¿Me falta alguna pieza de configuración? ¿O simplemente no es así como funciona?

No estoy muy familiarizado con WebSockets o este proyecto de Spring todavía, así que gracias de antemano.

Controller.java

... @MessageMapping("/fleet/{fleetId}/driver/{driverId}") @SendTo("/topic/fleet/{fleetId}") public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) { return new Simple(fleetId, driverId); } ...

WebSocketConfig.java

@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/live"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/fleet").withSockJS(); } }

index.html

var socket = new SockJS(''/fleet''); var stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { // Doesn''t Work stompClient.subscribe(''/topic/fleet/MyFleet'', function(greeting) { // Works stompClient.subscribe(''/topic/fleet/{fleetId}'', function(greeting) { // Do some stuff }); });

Enviar muestra

stompClient.send("/live/fleet/MyFleet/driver/MyDriver", {}, JSON.stringify({ // Some simple content }));