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