1. 背景介绍
之前提到使用原始的websocket,实现后台消息的主动推送,但是这种方式过于偏向底层,需要开发人员去手动的保存用户连接到websocket中的信息,这个信息不仅仅是用户的id、name而已还要保存他们的订阅信息,因为完完全全有可能所有已连接用户需要推送的消息是不一样的,而且可能一个用户会订阅很多的推送信息,比如说:在一个新闻网页中,有的用户对军事感兴趣,有的用户对科技感兴趣,有的对开源的代码感兴趣,而有的可能对所有的都感兴趣,如果你们老板要求这些东西需要根据数据库实时更新的话,在使用原始的websocket来管理就会变成十分麻烦
2. 基于STOMP协议的WebSocket
使用STOMP的好处在于,它完全就是一种消息队列模式,你可以使用生产者与消费者的思想来认识它,发送消息的是生产者,接收消息的是消费者。而消费者可以通过订阅不同的destination,来获得不同的推送消息,不需要开发人员去管理这些订阅与推送目的地之前的关系,spring官网就有一个简单的spring-boot的stomp-demo

pom.xml需要引入spring-boot-starter-websocket
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></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);
}
}
- websocket配置```java@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {/** 路径"/webSocketEndPoint"被注册为STOMP端点,对外暴露,客户端通过该路径接入WebSocket服务*/// 重点在withSockJS()registry.addEndpoint("/webSocketServer").setAllowedOrigins("*").withSockJS();// 小程序连接registry.addEndpoint("/wxServer").setAllowedOrigins("*").addInterceptors();}@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {/** 用户可以订阅来自以"/topic"为前缀的消息,* 客户端只可以订阅这个前缀的主题* topic一般用于广播推送,queue用于点对点推送*/config.enableSimpleBroker("/topic");/** 客户端发送过来的消息,需要以"/app"为前缀,再经过Broker转发给响应的Controller,*/config.setApplicationDestinationPrefixes("/app");//服务端通知客户端的前缀,可以不设置,默认为userconfig.setUserDestinationPrefix("/user");}}
