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