Spring websockets:消息未发布

时间:2016-05-20 11:36:20

标签: java spring websocket stomp spring-websocket

我使用带有STOMP和SockJS的Spring WebSockets作为前端。它工作很精细,但我有另一个困难。

这是后端代码:

 @MessageMapping("/showAccountlist")
 @SendTo("/topic/accounts")
 public Account createPublishAccount(String name) throws Exception {

     return new Account(name);
 }

这是前端代码,它运行FINE,所有消息都发布到所有客户端。

 stompClient.send("/app/showAccountlist", {}, name);

但是当我从我的java后端调用我的后端方法时,方法名称为

createPublishAccount("Carlos");

似乎消息未发布。有解决方案吗或者这不是它的工作方式,只有当它通过SockJS触发时才有效?

这是我的webconfig:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer  {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}

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

}

1 个答案:

答案 0 :(得分:4)

通过调用@SendTo带注释的方法似乎无法发送消息。

Spring推荐的发送消息的方式是使用SimpMessagingTemplate。可以将desination作为参数(在您的情况下为/topic/accounts),例如在convertAndSendToUser方法(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/messaging/simp/SimpMessagingTemplate.html)中。

请参阅Spring文档的摘录 (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-handle-send):

  

如果您想从应用程序的任何部分向连接的客户端发送消息,该怎么办?任何应用程序组件都可以向" brokerChannel"发送消息。最简单的方法是注入SimpMessagingTemplate,并使用它来发送消息。通常,应该很容易按类型注入,例如:

@Controller
public class GreetingController {

    private SimpMessagingTemplate template;

    @Autowired
    public GreetingController(SimpMessagingTemplate template) {
        this.template = template;
    }

    @RequestMapping(path="/greetings", method=POST)
    public void greet(String greeting) {
        String text = "[" + getTimestamp() + "]:" + greeting;
        this.template.convertAndSend("/topic/greetings", text);
    }

}