我想向特定记录的websocket订阅者发送消息 - 当我的某个服务类中发生某个操作时。
我正在尝试阅读Spring Websocket documentation,但对于如何让所有这些事情一起工作,这有点模棱两可。
以下是我的设置文件(这是扩展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();
}
控制器类(尝试实现一个简单的代理我可以测试从sockjs订阅并接收在应用程序中其他地方生成的消息:
@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);
// ...
}
当我在public void activity
方法上设置断点时,我什么都没得到?
答案 0 :(得分:0)
使用消息传递模板向"/topic/commandcenterID"
发送消息将该消息发送到消息代理,消息代理将该消息分发给订阅该主题的客户端。因此,它不会通过您的活动方法。
使用@MessageMapping
带注释的方法时,您将其声明为应用程序目标。所以发送消息给"/app/ws
&#34;应映射到该方法。请注意,在这种情况下,我怀疑它是否有效,因为@MessageMapping
注释中的路径定义中缺少您期望作为方法参数的目标变量。
此外,@SendTo
注释实际上告诉Spring,方法返回的值应转换为消息并发送到给定目标。
看来你在这里混合了一些东西,我认为你应该: