背景
项目一开始设计的是前端页面刷新以get方式获取数据,后来要求设备数据实时推送给前端,这样就需要和前端建立一个通道。然后我查看了一些资料,传统的websocket只是一个通道,发送的数据对方并不认识,所以我选择了websocket一个子协议stomp。它类似于kafka有多个主题,后端向某一个主题发送数据,只有订阅了该主题的客户端才会收到推送到这个主题的数据。
stomp
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。
下面是实现代码
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
/**
* 服务端两次心跳时间间隔的最小毫秒数
*/
@Value("${websocket.heartbeat.heartbeat-interval-server}")
private long heartbeatIntervalServer;
/**
* 服务端接收客户端两次心跳的时间间隔
*/
@Value("${websocket.heartbeat.heartbeat-interval-client}")
private long heartbeatIntervalClient;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
long[] heartbeat = {heartbeatIntervalServer, heartbeatIntervalClient};
ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler();
te.setPoolSize(1);
te.setThreadNamePrefix("wss-heartbeat-thread-");
te.initialize();
config.enableSimpleBroker("/api/v1/ws/devices")
.setHeartbeatValue(heartbeat)
.setTaskScheduler(te);
config.setApplicationDestinationPrefixes("/ws");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/api/v1/ws").setAllowedOrigins("*");
}
}
@Autowired
private SimpMessageSendingOperations simpMessageSendingOperations;
simpMessageSendingOperations.convertAndSend("topic", payload); // 推送数据
}
本文暂时没有评论,来添加一个吧(●'◡'●)