2017-02-04 3 views
1

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"); 
    } 
} 
+0

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

Antwort

0

können Sie ApplicationListener und SessionSubscribeEvent verwenden. Beispiel:

@Component 
public class SubscribeListener implements ApplicationListener<SessionSubscribeEvent> { 

    private final SimpMessagingTemplate messagingTemplate; 

    @Autowired 
    public SubscribeListener(SimpMessagingTemplate messagingTemplate) { 
     this.messagingTemplate = messagingTemplate; 
    } 

    @Override 
    public void onApplicationEvent(SessionSubscribeEvent event) { 
     messagingTemplate.convertAndSendToUser(event.getUser().getName(), "/topic/mydest", "Last known error count"); 
    } 
} 
+0

Ich werde das versuchen. Aber braucht das kein zusätzliches Abonnement für '/ user/topic/mydest'? – rainerfrey

+0

Nein, nur Abonnement für/topic/mydest. Getestet mit meiner App - funktioniert gut – Tolledo

+0

Es funktioniert nicht für mich. Die Idee, das 'SessionSubscribeEvent' zu verwenden, ist ein wertvoller Hinweis, und ich weiß es zu schätzen. Aber das Senden einer Nachricht an das _user destination_ '/ topic/mydest' ist ** nicht ** für das neue Abonnement des regulären _broker_destination'/topic/mydest'. Ehrlich gesagt, ich sehe keinen Hinweis in den Dokumenten, um diese Annahme zu unterstützen. Natürlich kann ich 'messagingTemplate.convertAndSend ("/topic/mydest ") im Ereignis-Listener tun und eine Nachricht an jeden Abonnenten senden. Während das für diese Art von Nachricht nicht wirklich schmerzen würde, ist es nicht das, was ich tun möchte. – rainerfrey

Verwandte Themen