Zmienne ścieżki w Spring WebSockets @SendTo mapping

Mam, co myślę, że być, bardzo prosta aplikacja Spring WebSocket. Staram się jednak użyć zmiennych ścieżki dla subskrypcji, a także mapowania wiadomości.

Zamieściłem parafrazowany przykład poniżej. Spodziewałbym się, że adnotacja @SendTo powróci do subskrybentów na podstawie ich fleetId. ie, a POST do /fleet/MyFleet/driver/MyDriver powinien powiadomić subskrybentów /fleet/MyFleet, ale nie widzę takiego zachowania.

Warto zauważyć, że subskrybowanie dosłownego /fleet/{fleetId} działa. Czy to zamierzony? Brakuje mi jakiejś konfiguracji? A może nie tak to działa?

Nie znam jeszcze WebSockets ani tego wiosennego projektu, więc z góry dziękuję.

Kontroler.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();
    }
}

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

Wyślij Próbkę

    stompClient.send("/live/fleet/MyFleet/driver/MyDriver", {}, JSON.stringify({
        // Some simple content
    }));
Author: bvulaj, 2014-11-20

1 answers

Mimo że @MessageMapping obsługuje placeholdery, nie są one ujawniane / rozwiązywane w miejscach docelowych @SendTo. Obecnie nie ma możliwości zdefiniowania dynamicznych miejsc docelowych za pomocą adnotacji @SendTo (patrz numer SPR-12170). Na razie możesz użyć SimpMessagingTemplate (tak to działa wewnętrznie). Oto jak byś to zrobił:

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

W Twoim kodzie, miejsce docelowe " / topic / fleet / {fleetId} " jest traktowane jako literalne, dlatego subskrybowanie go działa, po prostu ponieważ wysyłasz do dokładnie tego samego miejsca docelowego.

Jeśli chcesz tylko wysłać kilka początkowych danych konkretnych użytkowników, możesz zwrócić je bezpośrednio w subskrypcji:

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

Aktualizacja: W wersji wiosennej 4.2 obsługiwane są symbole zastępcze zmiennych docelowych.]}

@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
    return new Simple(fleetId, driverId);
}
 76
Author: Sergi Almar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 16:35:46