1、前言
在很多业务场景中,对实时数据要求比较高,我们就不能采用轮训拉取的方式来获取数据了。就可以采用websocket的长链接的形式,实时有服务端或者客户端推送数据,已达到数据的实时展示。
2、websocket简介
SpringBoot官方推荐的基于STOMP实现,STOMP:即Simple Text Orientated Messaging Protocol
,它是一个简单的文本消息传输协议,属于 WebSocket 的子协议, 提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单, 易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。有点类似于Kafka的发布订阅模式。
3、环境
JDK8 + maven3.x + spring5.x
4、引入依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-websocket
org.springframework.boot
spring-boot-starter-thymeleaf
5、websocket配置类
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
// 设置socket连接
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/testSocket")
.setAllowedOrigins("*") //解决跨域问题
.withSockJS();
}
// 设置发布订阅的主题
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/top");
}
}
spring5.0以下,创建websocket的配置类的时候需要继承 AbstractWebSocketMessageBrokerConfigurer。
但是5.0以后该方法就过时了,5.0以后是基于JDK1.8,接口中支持默认方法,如图:
所以直接实现 WebSocketMessageBrokerConfigurer 这个接口,重新需要的方法即可。
registry.enableSimpleBroker("/top","/t");
这个属性的配置用来路由各种消息,分别路由到已配置项为前缀的订阅消息中,其中注意【/】不能忽略,否则路由失效。配置有broker之后,你会发现以【/topic】为前缀的依然有效。查看源码你会发现,源码中有两个默认路由规则:【/topic】【/queue】
6、创建消息发送的控制类
为了测试方便,我把普通的控制和消息发送的控制层写在了一个controller中:
@Controller
public class WebSocketController {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/test")
@SendTo("/top/test")
@ResponseBody
public String call(String msg){
System.out.println(msg);
return msg;
}
@RequestMapping("/test01")
@ResponseBody
public String send() {
System.out.println("发送成功");
simpMessagingTemplate.convertAndSend("/top/test", "send.....");
return "调用成功!";
}
@RequestMapping("/socketPage")
public String socketPage(){
return "socket";
}
@SubscribeMapping("/top/test")
public String test02(){
String msg = " @SubscribeMapping";
System.out.println(msg);
return msg;
}
}
其中 @RequestMapping 代表普通控制层,而 @MessageMapping 代表websocket发送消息的映射。
7、客户端
webSocket
Socket 网络实时交互测试
由于thymeleaf都采用的是默认的配置方式,所以就没有对应的.properitiesh或.yml文件。
8、启动结果
核心方法:
9、参考文档
技术博客:
https://www.xncoding.com/2017/07/15/spring/sb-websocket.html
https://blog.csdn.net/weixin_44619017/article/details/100519951
https://blog.csdn.net/u013753225/article/details/83004871
官方文档:
https://spring.io/guides/gs/messaging-stomp-websocket/