Springboot针对websocket 4类的监听器介绍和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

SpringBoot里面websocekt监听器的使用,包含订阅、取消订阅,socekt连接和断开连接4类监听器的编写和使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用步骤

1.监听器类需要实现接口ApplicationListener T表示事件类型,下列几种都是对应的websocket事件类型

  • 四种监听器类型:
  • SessionconnectEvent 建立连接事件
  • SessionDisconnectEvent 断开连接事件
  • SessionSubscribeEvent : 订阅事件
  • SessionUnSubscribeEvent : 订阅事件

代码如下(示例):

@Component
public class ConnectListenerEvent implements ApplicationListener<SessionConnectedEvent> {
    @Override
    public void onApplicationEvent(SessionConnectedEvent sessionConnectedEvent) {
        //StompHeaderAccessor 专门用于stomp头
        //SimpMessageHeaderAccessor 专门用于所有消息传递协议头
        StompHeaderAccessor wrap = StompHeaderAccessor.wrap(sessionConnectedEvent.getMessage());
        System.out.println("【SessionConnectedEventl 监听事件类型】" + wrap.getCommand());
    }
}

2、在监听器类上注解 @Component,spring会把改类纳入管理

### Spring Boot WebSocket 的稳定性与消息送达保障 #### 一、WebSocket 协议简介 WebSocket 是一种通信协议,允许客户端服务器之间建立持久连接并实现实时双向数据交换。相比传统的 HTTP 请求响应模式,WebSocket 提供更低延迟的数据传输。 #### 二、Spring Boot 中 WebSocket 实现方式及其稳定性措施 为了提高 Websocket 在 Spring Boot 应用中的可靠性,可以采取如下策略: - **心跳检测机制** 通过定时发送 ping/pong 帧来保持会话活跃状态,防止因网络波动导致的异常断开。可以在 `@Configuration` 中定义 `WebSocketMessageBrokerStats` 来监控连接状况[^1]。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors(new ChannelInterceptor() { private final AtomicLong messageCount = new AtomicLong(); @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { if (message.getHeaders().get("simpMessageType").equals(SimpMessageType.HEARTBEAT)) { System.out.println("Heartbeat detected"); } return message; } // Other methods... }); } } ``` - **重连逻辑设计** 当发生意外掉线情况时,前端页面应具备自动尝试重新连接的能力;而后端服务则需记录用户的在线状态,在用户再次登录时推送未读取的消息。这可以通过监听器实现,如 `SessionConnectEvent`, `SessionDisconnectEvent` 等事件处理程序[^2]。 ```java @Component public class StompEventHandler { @EventListener public void handleWebsocketConnectedListener(SessionConnectedEvent event){ SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(event.getMessage()); String username = (String)headerAccessor.getSessionAttributes().get("username"); logger.info(username + " connected."); // Send any missed messages here. } @EventListener public void handleWebsocketDisconnectedListener(SessionDisconnectEvent event){ String username = (String)event.getUser().getName(); logger.info(username + " disconnected."); // Handle disconnection logic such as marking user offline or saving session state. } } ``` - **优化性能参数设置** 调整 Tomcat 或 Undertow 容器的相关属性以适应不同规模的应用场景需求,比如增大最大并发数、延长超时时间等。对于生产环境部署建议参照官方文档最佳实践指南进行调优[^3]。 ```properties server.tomcat.max-http-post-size=-1 server.undertow.io-threads=4 server.undertow.worker-threads=64 management.endpoints.web.exposure.include=* ``` #### 三、确保消息可靠传递的方法 针对消息投递过程中可能出现丢失的情况,可采用以下几种手段增强系统的健壮性: - **确认收条功能** 利用 STOMP 协议提供的 ACK/NACK 模型让接收方显式告知已成功收到某条特定编号的信息,从而使得发送者能够判断是否需要补发副本[^4]。 ```javascript // Client side JavaScript code snippet using SockJS and STOMP.js libraries. var client = stompClient.connect('/ws', function(frame) { console.log('Connected: ' + frame); client.subscribe('/topic/messages', function(messageOutput) { var body = JSON.parse(messageOutput.body); // Process the received data... setTimeout(function(){ client.send("/app/receipt", {}, JSON.stringify({'id':body.id})); }, Math.floor(Math.random()*500)); },{ack:'client'}); }); ``` - **持久化存储离线消息** 一旦发现目标订阅者暂时不在线,则立即将待转发的内容暂存于数据库表内等待后续恢复通讯后再做分发操作。此过程涉及到事务管理以及幂等问题考虑,务必谨慎实施[^5]。 ```sql CREATE TABLE IF NOT EXISTS OfflineMessages ( id BIGINT AUTO_INCREMENT PRIMARY KEY, recipient VARCHAR(255), payload TEXT, sent BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值