2016-06-29 10 views
0

Ich möchte eine Nachricht an Websocket-Abonnenten eines bestimmten Datensatzes senden - wenn eine Aktion in einer meiner Serviceklasse stattfindet.Spring send Nachricht an Websocket Message Broker

Ich versuche, die Spring Websocket documentation zu lesen, aber es ist irgendwie zweideutig bis zu dem Punkt, wie all diese Dinge zusammenarbeiten.

Hier sind meine Setup-Dateien (diese erweitert jHipster btw):

WebsocketConfiguration.java

@Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableStompBrokerRelay("/queue/", "/topic/", "/exchange/"); 
     config.setApplicationDestinationPrefixes("/app"); 
     config.setPathMatcher(new AntPathMatcher(".")); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/ws").withSockJS(); 
    } 

WebsocketSecurity.java

@Override 
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { 
    messages 
     // message types other than MESSAGE and SUBSCRIBE 
     .nullDestMatcher().authenticated() 
     // matches any destination that starts with /rooms/ 
     .simpDestMatchers("/topic/tracker").hasAuthority(AuthoritiesConstants.ADMIN) 
     .simpDestMatchers("/topic/**").authenticated() 
     // (i.e. cannot send messages directly to /topic/, /queue/) 
     // (i.e. cannot subscribe to /topic/messages/* to get messages sent to 
     // /topic/messages-user<id>) 
     .simpTypeMatchers(SimpMessageType.MESSAGE, SimpMessageType.SUBSCRIBE).denyAll() 
     // catch all 
     .anyMessage().denyAll(); 
} 

Controller-Klasse (Versuch, einen einfachen Broker Umsetzung Ich kann Abonnements von Sockjs testen und Nachrichten empfangen, die an anderer Stelle in der Anwendung generiert wurden:

@MessageMapping("/ws") 
@SendTo("/topic/sendactivity.{id}") 
public void activity(@DestinationVariable string id, @Payload String message){ 
    log.debug("Sending command center: "+message); 
} 

@RequestMapping(value = "/updateactivity", method = RequestMethod.PUT) 
public ResponseEntity<Membership> updateMembership(
     @RequestBody Membership membership) throws URISyntaxException { 
    // ... 
    String testString = "test"; 
    messagingTemplate.convertAndSend("/topic/commandcenter"+membership.getId().toString(), testString); 
    // ... 
} 

Wenn ich einen Breakpoint auf die public void activity Methode setze, bekomme ich nichts?

+0

Könnten Sie die SockJS-Client-Protokolle teilen? Es gibt keine Möglichkeit zu sehen, welche Nachricht gesendet wurde und welche Antwort sie erhielt. Könnten Sie auch 'org.springframework.web.socket' in DEBUG einfügen und die relevanten Logs ebenfalls teilen? –

+0

@BrianClozel - Ich habe den Kanal noch nicht abonniert - würde das dazu führen, dass er nicht aktiv ist ?! Ich dachte, nachdem ich 'convertAndSend' ausgeführt habe, sollte ich den Breakpoint in der' void activity' Methode treffen? –

Antwort

0

Das Senden einer Nachricht an "/topic/commandcenterID" mithilfe der Nachrichtenvorlage wird diese Nachricht an den Nachrichtenbroker senden, der diese Nachricht an Clients senden wird, die dieses Thema abonniert haben. Es wird also nicht durch Ihre Aktivitätsmethode fließen.

Bei Verwendung von annotierten Methoden mit @MessageMapping deklarieren Sie diese als Anwendungsziele. Senden Sie also eine Nachricht an "/app/ws "sollte dieser Methode zugeordnet werden. Beachten Sie, dass in diesem Fall ich bezweifle, dass es funktioniert, da die Zielvariable, die Sie als ein Methodenargument erwarten, in der Pfaddefinition in der @MessageMapping-Annotation fehlt. die @SendTo Anmerkung in der Tat sagt Frühling, dass der Wert von der Methode zurück sollte zu einer Nachricht und schickte zum angegebenen Ziel umgewandelt werden

Es scheint, dass Sie die Dinge hier abmischen, und ich denke, Sie sollen:.

Verwandte Themen