Pfadvariablen in Spring WebSockets @SendTo-Zuordnung

Lesezeit: 4 Minuten

Ich habe, was ich denke, eine sehr einfache Spring WebSocket-Anwendung. Ich versuche jedoch, Pfadvariablen sowohl für das Abonnement als auch für die Nachrichtenzuordnung zu verwenden.

Ich habe unten ein paraphrasiertes Beispiel gepostet. Ich würde die erwarten @SendTo Anmerkung, um basierend auf ihrer an die Abonnenten zurückzusenden fleetId. dh, ein POST zu /fleet/MyFleet/driver/MyDriver sollten die Abonnenten benachrichtigen /fleet/MyFleetaber ich sehe dieses Verhalten nicht.

Es ist erwähnenswert, dass das Abonnieren von literal /fleet/{fleetId} funktioniert. Ist das beabsichtigt? Übersehe ich einen Teil der Konfiguration? Oder funktioniert das einfach nicht so?

Ich bin noch nicht sehr vertraut mit WebSockets oder diesem Spring-Projekt, also danke im Voraus.

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

Muster senden

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

Benutzer-Avatar
Sergi Almar

Wenngleich @MessageMapping unterstützt Platzhalter, sie werden nicht exponiert/aufgelöst @SendTo Reiseziele. Derzeit gibt es keine Möglichkeit, dynamische Ziele mit dem zu definieren @SendTo Anmerkung (siehe Ausgabe SPR-12170). Du könntest die verwenden SimpMessagingTemplate vorerst (so läuft es jedenfalls intern). So würden Sie vorgehen:

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

In Ihrem Code das Ziel ‘/topic/fleet/{fleetId}‘ wird als Literal behandelt, das ist der Grund, warum das Abonnieren funktioniert, nur weil Sie an genau dasselbe Ziel senden.

Wenn Sie nur einige anfängliche benutzerspezifische Daten senden möchten, können Sie diese direkt im Abonnement zurückgeben:

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

Aktualisieren:
In Spring 4.2 werden Platzhalter für Zielvariablen unterstützt. Es ist jetzt möglich, Folgendes zu tun:

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

  • Danke, @sergi! Ich hatte gehofft, mit dem MessagingTempalte herumzukommen, aber das funktioniert genauso gut. Was ist der Unterschied zwischen verwenden @SubscribeMapping und @SendTo? Überspringt Ersteres einfach den Message Broker?

    – bvulaj

    21. November 2014 um 14:17 Uhr

  • @SubscribeMapping fängt nur Abonnements ab (keine Nachrichten an den Kanal), Rückgabewert wird direkt an den Benutzer gesendet, kann aber mit überschrieben werden @SendTo um es an ein anderes Ziel zu senden (wird an den BrokerChannel weitergeleitet). @SendTo kann auch mit verwendet werden @MessageMapping um die Antwort an ein bestimmtes Ziel zu senden. Also im Prinzip, @SendTo kann zusammen mit verwendet werden @MessageMapping und @SubscribeMapping

    – Sergi Almar

    21. November 2014 um 15:40 Uhr


  • Ich soll das gleiche Projekt gleich machen, kann aber nicht starten, das gleiche Prototypprojekt kann verwendet werden, zum Beispiel in Github. Ich kenne die Arbeit von Spring, aber nicht die Arbeit von WebSocket, ich muss eine Nachricht an zwei Personen senden und die Nachricht ist gleich Skype. Eins-zu-eins, Baum, wenn Sie mehr Benutzerkommunikation einladen

    – Marcelo Ferreira

    15. Dezember 2016 um 18:11 Uhr

  • Vielen Dank für Ihre Updates zu dieser Antwort, es war wirklich hilfreich!

    – Vladlen Gladis

    16. Dezember 2016 um 12:55 Uhr

  • @JordanMackie prüfen github.com/salmar/spring-websocket-chat/blob/…

    – Sergi Almar

    28. Juni 2018 um 12:29 Uhr

Sie können eine Variable innerhalb des Pfads senden. zum Beispiel sende ich “este/es/el/chat/java/” und auf dem Server erhalten als “este:es:el:chat:java:

Klient:

stompSession.send("/app/chat/este/es/el/chat/java/*", ...);

Server:

@MessageMapping("/chat/**")
@SendToUser("/queue/reply")
public WebsocketData greeting(Message m,HelloMessage message,@Header("simpSessionId") String sessionId) throws Exception {
    Map<String, LinkedList<String>> nativeHeaders = (Map<String, LinkedList<String>>) m.getHeaders().get("nativeHeaders");
    String value= nativeHeaders.get("destination").getFirst().replaceAll("/app/chat/","").replaceAll("https://stackoverflow.com/",":");

Eigentlich denke ich, das ist, was Sie suchen könnten:

@Autorwired
lateinit var template: SimpMessageTemplate;

@MessageMapping("/class/{id}")
@Throws(Exception::class)
fun onOffer(@DestinationVariable("id") id: String?, @Payload msg: Message) {
    println("RECEIVED " + id)
    template.convertAndSend("/topic/class/$id", Message("The response"))
}

Hoffe das hilft jemandem! 🙂

1380610cookie-checkPfadvariablen in Spring WebSockets @SendTo-Zuordnung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy