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?
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? –
@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? –