Spring向Websocket Message Broker发送消息

时间:2016-06-29 02:39:37

标签: spring jhipster spring-websocket

我想向特定记录的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方法上设置断点时,我什么都没得到?

1 个答案:

答案 0 :(得分:0)

使用消息传递模板向"/topic/commandcenterID"发送消息将该消息发送到消息代理,消息代理将该消息分发给订阅该主题的客户端。因此,它不会通过您的活动方法。

使用@MessageMapping带注释的方法时,您将其声明为应用程序目标。所以发送消息给"/app/ws&#34;应映射到该方法。请注意,在这种情况下,我怀疑它是否有效,因为@MessageMapping注释中的路径定义中缺少您期望作为方法参数的目标变量。 此外,@SendTo注释实际上告诉Spring,方法返回的值应转换为消息并发送到给定目标。

看来你在这里混合了一些东西,我认为你应该: