Mit dem Stomp-Broker-Relay für Web-Socket-Messaging kann ich ein Ziel /topic/mydest
abonnieren. Dies erstellt eine Broker-Subskription und empfängt alle Nachrichten, die von einem System im System für dieses Brokerziel ausgelöst werden. Dies geschieht, wenn ein Ereignis im System auftritt.Spring Web Socket Messaging - Abonnieren und Senden der ersten Nachricht
Ich kann ein Ziel /app/mydest
abonnieren, und eine Controller-Methode mit @SubscribeMapping("mydest")
wird aufgerufen, und der Rückgabewert wird nur an diesem Socket als eine Nachricht zurückgesendet. Soweit ich weiß, ist dies die einzige Nachricht, die jemals für dieses Abonnement gesendet wird.
Gibt es eine Möglichkeit, dies in einem einzigen Abonnement zu kombinieren, das heißt einen Broker Abonnement einen Code für einen bestimmten /topic
Ziel, und Trigger erstellen, die direkt eine Nachricht an den Teilnehmer zurückschickt?
Der Anwendungsfall: Wenn ein Fehler im System auftritt, wird eine Nachricht mit einer aktuellen Fehleranzahl an /topic/mydest
gesendet. Wenn ein neuer Client abonniert wird, möchte ich ihm nur die letzte bekannte Fehleranzahl senden. Andere sind in diesem Moment nicht interessiert, da sich der Graf nicht geändert hat.
Meine aktuelle Lösung besteht darin, sowohl /app/mydest
als auch /topic/mydest
zu abonnieren und denselben Meldungshandler auf dem Client zu verwenden. Aber es ist wirklich ein logisches Abonnement, und es ist ein bisschen fehleranfällig, da ein Client daran denken muss, beide zu abonnieren.
Meine Fragen in diesem Zusammenhang: wird es jemals eine weitere Nachricht für das /app/
Abonnement geben? Gibt es etwas zu rufen, um einen auszulösen? Wie sonst kann ich einem Abonnenten für ein Thema erste Informationen senden, ohne redundante Nachrichten an die vorhandenen Abonnenten zu senden?
Wie gewünscht, hier ist meine Websocket-Konfigurationsklasse.
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/queue/", "/topic/", "/exchange/");
registry.setApplicationDestinationPrefixes("/app");
}
}
Vielleicht sollte ich klarstellen: die aktuelle Lösung, die ich beschreiben fein genug vom praktischen Standpunkt aus ist. Meine Hauptmotivation für die Frage besteht darin, die Absicht von ** Subskriptionen ** für Benutzerziele vollständig zu verstehen und Möglichkeiten zu finden, auf Subskriptionen für Brokerziele zu reagieren. – rainerfrey