1. 背景介绍

之前提到使用原始的websocket,实现后台消息的主动推送,但是这种方式过于偏向底层,需要开发人员去手动的保存用户连接到websocket中的信息,这个信息不仅仅是用户的id、name而已还要保存他们的订阅信息,因为完完全全有可能所有已连接用户需要推送的消息是不一样的,而且可能一个用户会订阅很多的推送信息,比如说:在一个新闻网页中,有的用户对军事感兴趣,有的用户对科技感兴趣,有的对开源的代码感兴趣,而有的可能对所有的都感兴趣,如果你们老板要求这些东西需要根据数据库实时更新的话,在使用原始的websocket来管理就会变成十分麻烦

2. 基于STOMP协议的WebSocket

使用STOMP的好处在于,它完全就是一种消息队列模式,你可以使用生产者与消费者的思想来认识它,发送消息的是生产者,接收消息的是消费者。而消费者可以通过订阅不同的destination,来获得不同的推送消息,不需要开发人员去管理这些订阅与推送目的地之前的关系,spring官网就有一个简单的spring-boot的stomp-demo

image.png

  • pom.xml需要引入spring-boot-starter-websocket

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-websocket</artifactId>
    4. </dependency>
  • 接收客户端发来的消息(@MessageMapping(“/send”)) ```java @RestController public class StompController { @Autowired SimpMessagingTemplate SMT;

    @MessageMapping(“/send”) public void subscription(String str) throws MessagingException, UnsupportedEncodingException { System.err.println(str); SMT.convertAndSend(“/topic/sub”,”开始推送消息了:”+str);

    }

}

  1. - websocket配置
  2. ```java
  3. @Configuration
  4. @EnableWebSocketMessageBroker
  5. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
  6. @Override
  7. public void registerStompEndpoints(StompEndpointRegistry registry) {
  8. /*
  9. * 路径"/webSocketEndPoint"被注册为STOMP端点,对外暴露,客户端通过该路径接入WebSocket服务
  10. */
  11. // 重点在withSockJS()
  12. registry.addEndpoint("/webSocketServer").setAllowedOrigins("*").withSockJS();
  13. // 小程序连接
  14. registry.addEndpoint("/wxServer").setAllowedOrigins("*").addInterceptors();
  15. }
  16. @Override
  17. public void configureMessageBroker(MessageBrokerRegistry config) {
  18. /*
  19. * 用户可以订阅来自以"/topic"为前缀的消息,
  20. * 客户端只可以订阅这个前缀的主题
  21. * topic一般用于广播推送,queue用于点对点推送
  22. */
  23. config.enableSimpleBroker("/topic");
  24. /*
  25. * 客户端发送过来的消息,需要以"/app"为前缀,再经过Broker转发给响应的Controller,
  26. */
  27. config.setApplicationDestinationPrefixes("/app");
  28. //服务端通知客户端的前缀,可以不设置,默认为user
  29. config.setUserDestinationPrefix("/user");
  30. }
  31. }