首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果使用Spring + SockJS + STOMP,websocket消息会被缓存吗?如果没有,如何检测网络断开?

在使用Spring + SockJS + STOMP的情况下,websocket消息不会被缓存。

要检测网络断开,可以使用WebSocket的心跳机制。通过定期发送心跳消息,来检测与服务器的连接是否断开。如果一定时间内没有收到服务器的响应,就可以认为网络已经断开。可以在客户端使用setInterval函数来定时发送心跳消息,并在服务器端设置一个对应的心跳处理器来处理心跳消息。如果服务器端长时间没有收到心跳消息,可以通过适当的超时时间来判断网络是否断开,并执行相应的处理逻辑。

以下是一种检测网络断开的实现示例:

代码语言:txt
复制
// 客户端代码
var heartbeatInterval = 10000; // 心跳间隔时间,单位为毫秒
var heartbeatTimer = null;

function sendHeartbeat() {
    stompClient.send("/app/heartbeat");
}

function startHeartbeat() {
    heartbeatTimer = setInterval(sendHeartbeat, heartbeatInterval);
}

function stopHeartbeat() {
    clearInterval(heartbeatTimer);
}

// 在连接成功后启动心跳
stompClient.connect({}, function(frame) {
    console.log('Connected: ' + frame);
    startHeartbeat();
});

// 在接收到消息时重置心跳计时器
stompClient.subscribe('/topic/messages', function(message) {
    console.log('Received: ' + message.body);
    // 重置心跳计时器
    clearInterval(heartbeatTimer);
    startHeartbeat();
});

// 服务器端代码
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
    
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket").withSockJS();
    }
    
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(new HeartbeatInterceptor());
    }
}

public class HeartbeatInterceptor extends ChannelInterceptorAdapter {
    
    private static final long HEARTBEAT_TIMEOUT = 20000; // 心跳超时时间,单位为毫秒
    
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        // 处理心跳消息
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
        if (accessor.getCommand() == StompCommand.SEND && "/app/heartbeat".equals(accessor.getDestination())) {
            // 不做处理,直接返回
            return message;
        }
        
        // 判断是否超时
        long lastActiveTime = (long) accessor.getSessionAttributes().get("lastActiveTime");
        if (System.currentTimeMillis() - lastActiveTime > HEARTBEAT_TIMEOUT) {
            // 触发网络断开的逻辑
            System.out.println("Network Disconnected!");
        }
        
        // 更新最后活动时间
        accessor.getSessionAttributes().put("lastActiveTime", System.currentTimeMillis());
        
        return message;
    }
    
    @Override
    public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
        // 处理发送的消息
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
        if (StompCommand.CONNECTED.equals(accessor.getCommand())) {
            // 初始化最后活动时间
            accessor.getSessionAttributes().put("lastActiveTime", System.currentTimeMillis());
        }
    }
}

对于推荐的腾讯云相关产品,由于不能提及云计算品牌商,无法给出具体推荐的产品和链接地址,请根据实际需求自行选择适合的腾讯云产品进行使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Websocket 中文文档 (spring5)

如果消息量相对较低(例如,监视网络故障),则HTTP流式传输或轮询可以提供有效的解决方案。它是低延迟,高频率和高容量的组合,是使用WebSocket的最佳选择。...在WebSocket / SockJS使用STOMP时,如果STOMP客户端和服务器协商要交换的心跳,则会禁用SockJS心跳。...由于SpringSockJS服务支持服务器发送的心跳(默认情况下每25秒),这意味着如果更频繁地发送消息,通常会在该时间段或更早的时间内检测到客户端断开连接。...因此,网络IO故障可能仅仅因为客户端已断开连接而发生,这可能会使用不必要的堆栈跟踪填充日志。...Spring尽最大努力识别代表客户端断开连接(特定于每个服务器)的网络故障,并使用中DISCONNECTED_CLIENT_LOG_CATEGORY 定义的专用日志类别记录最小消息AbstractSockJsSession

11.9K76

SpringBoot 实战 (十六) | 整合 WebSocket 基于 STOMP 协议实现广播消息

WebSocket 是通过一个 socket 来实现双工异步通信能力的,但直接使用 WebSocket ( 或者 SockJSWebSocket 协议的模拟,增加了当前浏览器不支持使用 WebSocket...STOMP 协议使用一个基于 (frame) 的格式来定义消息,与 Http 的 request 和 response 类似 。 广播 接下来,实现一个广播消息的 demo。...注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller) // 开始支持@MessageMapping,就像是使用@requestMapping...的节点(endpoint),并指定使用 SockJS 协议。...@SendTo("/nasus/getResponse") // 如果服务器接受到了消息,就会对订阅了 @SendTo 括号中的地址的浏览器发送消息

2.9K40

Spring Boot框架下使用WebSocket实现消息推送

前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目/http://blog.csdn.net/u012702547/article/details.../article/details/53790722),在这两篇文章的基础上,我们今天来看看如何Spring Boot中使用WebSocket。...OK,关于WebSocket我这里就不再多说,我们主要看如何使用如果小伙伴们有兴趣可以查看这个回答来了解更多关于WebSocket的信息[WebSocket 是什么原理?...首先js文件引入的那一部分我就不再多说,这里如果又不理解的可以参考使用Spring Boot开发Web项目。...我在最上面的浏览器上发送消息,其他两个浏览器都能收到我的消息。 OK ,以上就是我们在Spring Boot框架下使用WebSocket实现消息推送的全过程。

3K40

websocket消息推送设计

该方案用到了还要用到SockJs+STOMPSockJSWebSocket 技术的一种模拟。为了应对许多浏览器不支持WebSocket协议的问题,设计了备选SockJs。...开启并使用SockJS后,它会优先选用Websocket协议作为传输协议,如果浏览器不支持Websocket协议,则会在其他方案中,选择一个较好的协议进行通讯。 STOMP是面向消息的简单文本协议。...使用STOMP的好处在于,它完全就是一种消息队列模式,你可以使用生产者与消费者的思想来认识它,发送消息的是生产者,接收消息的是消费者。...优点:性能良好,社区活跃,技术成熟,协议栈丰富,有全套 Spring 解决方案,兼容性强。 缺点:需要对 SockJSSTOMP 进行学习,断线重连、心跳检测、二进制支持不好,需要自行实现。...此时客户端定时向服务端发送心跳消息如果超过设定的时间仍没有收到心跳,则认为客户端与服务端的长连接已经断开,然后服务端会关闭连接并清理内存中的会话信息。

4.5K10

WebSocket的姨母级教程

WebSocket 特点 连接握手阶段使用 HTTP 协议; 协议标识符是 ws,如果采用加密则是 wss; 数据格式比较轻量,性能开销小,通信高效; 没有同源限制,客户端可以与任意服务器通信; 建立在...与 HTTP(它是应用程序级协议)不同,在 WebSocket 协议中,传入消息中根本没有足够的信息供框架或容器知道如何路由或处理它。...StompWebSocket 的关系 直接使用 WebSocket 就很类似于使用 TCP 套接字来编写 Web 应用,因为没有高层级的应用协议(wire protocol),因而就需要我们定义应用之间所发送消息的语义...ActiveMQ等)进行广播的选项 使用STOMP(相对于普通 WebSocket)使 Spring Framework 能够为应用程序级使用提供编程模型,就像 Spring MVC 提供基于 HTTP...Spring 封装的 STOMP 使用 SpringSTOMP 支持时,Spring WebSocket 应用程序充当客户端的 STOMP 代理。

2.3K20

Spring国际认证指南:使用 WebSocket 构建交互式 Web 应用程序

原标题:Spring国际认证指南|了解如何通过 WebSocket 在浏览器和服务器之间发送和接收消息 本指南将引导您完成创建“Hello, world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消息...WebSocket 是 TCP 之上的一个轻量级的薄层。这使得它适合使用“子协议”来嵌入消息。在本指南中,我们使用带有 SpringSTOMP消息传递来创建交互式 Web 应用程序。...为 STOMP 消息配置 Spring 现在已经创建了服务的基本组件,您可以配置 Spring 以启用 WebSocketSTOMP 消息传递。...该connect()函数使用SockJSstomp.js打开到 的连接/gs-guide-websocket,这是我们的 SockJS 服务器等待连接的地方。...此时,您可以发送另一个名称,也可以单击“断开连接”按钮关闭连接。 概括 恭喜!您刚刚使用 Spring 开发了一个基于 STOMP消息传递服务。

1.9K20

Spring WebSocket初探2 (Spring WebSocket入门教程)

See more: Spring WebSocket reference 整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的...接上一篇:Spring WebSocket初探1 (Spring WebSocket入门教程) WebSocket前端准备 前端我们需要用到两个js文件: sockjs.js和stomp.js...SockJSSockJS 是一个浏览器上运行的 JavaScript 库,如果浏览器不支持 WebSocket,该库可以模拟对 WebSocket 的支持,实现浏览器和 Web 服务器之间低延迟...Stomp Stomp 提供了客户端和代理之间进行广泛消息传输的框架。...Stomp 是一个非常简单而且易用的通讯协议实现,尽管代理端的编写可能非常复杂,但是编写一个 Stomp 客户端却是很简单的事情,另外你可以使用 Telnet 来与你的 Stomp 代理进行交互。

61430

学习WebSocket

Websocket 出场 WebSocket 出现的目的没有别的,就是 干掉前面的东西,Both!...取消订阅 BEGIN 开启事务 COMMIT 提交事务 ABORT 回滚事务 ACK 确认消费 NACK 消息丢弃 DISCONNECT 断开连接 一个简单的STOMP消息大致如下: CONNECT...可能你看完前面的东西会觉得 WebSocket 是如此之强大,以至于很多场景都应该使用这个技术来实现。那么如何做?...还有一个好消息,就是spring-websocket 也默认支持了 Stomp协议(看吧,Stomp支持者太多了)。而除此之外,还内置了一个叫 SocketJS 的东西。...其项目地址:https://github.com/sockjs/sockjs-client 其他组件的说明 webjars 主要是将一些前端的框架打包到Jar包中以方便我们使用,这里我们添加了socketJS

1.4K10

Springboot +WebSocket学习

+SockJS框架实现参考文章 采坑 WebSocket区分不同客户端两种方法(HttpSession和@PathParam) Gitee源码链接 WebSocket介绍 WebSocket是一种网络通信协议...) SpringBoot2+Netty+WebSocket(netty实现websocket,支持URL参数) Stomp+SockJS框架实现参考文章 Spring websocket+Stomp+SockJS...实现实时通信 详解 Spring使用WebSocketSockJSSTOMP实现消息功能 Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程 Springboot...整合 WebSocket使用STOMP协议+Redis 解决负载场景问题(二) Springboot 整合 WebSocket使用STOMP协议 ,前后端整合实战 (一) 采坑 使用websocket...聊天室功能简陋版 待实现功能:信息的存储,可以使用localstorage,但是不够安全,信息会丢失,更建议结合rebbitmq或者redis做消息缓存处理

1.3K10

实现一个基于 Spring Boot 和 Vue.js 的实时消息推送系统

在这篇文章中,我将详细介绍如何使用 Spring Boot 和 Vue.js 创建一个实时消息推送系统,并确保每个用户只能接收属于自己的消息。这个系统不仅功能强大,而且实现起来并不复杂。...技术栈 为了实现上述功能,我们需要使用以下技术: 后端:Spring Boot、WebSocket、MySQL、Redis 前端:Vue.js、SockJSSTOMP 关键概念介绍 在正式开始实现之前...STOMP 协议本身不依赖于任何特定的传输协议,因此可以在多种传输协议上使用,如 TCP、WebSocket 等。...SockJS 确保了在各种网络条件和浏览器环境下都能正常工作,为我们的实时消息推送系统提供了坚实的基础。 项目实现步骤 步骤一:后端实现 1....我们详细介绍了 WebSocketSTOMPSockJS 等关键概念,并通过代码示例展示了如何配置和实现消息的实时推送和持久化存储。

15400

WebSocket 介绍以及配合 STOMP使用

由于近期需要使用 WebSocket 的部分功能,然而在工作过程中,发现自己对这部分知识点不是很了解,而且对于后台同学提出的 WebSocketSTOMP 的组合,不知如何下手。...本文行文为三个部分,分别讲述:Socket 是什么,WebSocket 是什么,STOMP 是什么,如何结合后两者投入使用。 1....如何使用 node 搭建一个简单的ws服务器 此处的 demo 是,通过 sockjs,建立一个ws服务器,连接两个或者多个客户端,当某一个客户端发送消息给服务器,服务器可以主动将该消息发送给别的客户端...因为 STOMP 协议和 WebSocket 都有已经实现了且可靠的库,在这里我们直接采用。WebSocket 采用 sockjsSTOMP 采用 stompjs。...其中就有,调用 stompjs 库,将 sockjs消息发送用 stomp 进行改写,将 WebSocket 的方法统统用 STOMP 协议的方法进行了包装一遍。

2.8K20

再谈 websocket 论架构设计

此图来源于github: sockjs-client 所以,如果使用SockJS进行通讯,它将在使用上保持一致,底层由它自己去选择相应的协议。...正如我们所知,如果websocket内容传输信息使用STOMP来进行交互,websocket也很好的于消息代理器进行交互(如:RabbitMQ, ActiveMQ) 这样就很好的提供了消息代理的集成方案..., ActiveMQ 技术落地 后端技术方案选型 websocket服务端选型:spring websocket 支持SockJS,开启SockJS后,可应对不同浏览器的通讯支持 支持STOMP传输协议...这是为了支持浏览器不支持websocket协议的一种备选方案 使用STOMP: 使用STOMP进行交互,前端可以使用stomp.js类库进行交互,消息STOMP协议格式进行传输,这样就规定了消息传输格式...这是为了消息统一管理,进行机器扩容时,可进行负载均衡部署 使用spring websocket: 使用spring websocket,是因为他提供了STOMP的传输自协议的同时,还提供了StockJS

2K11

Spring Boot实现带STOMPWebSocket

在本文中,我将向您展示如何使用 SpringBoot实现 WebSocket。我将介绍服务器端和客户端设置,使用 WebSocket协议之上的 STOMP进行相互通信。 服务器端将完全用Java编码。...代码示例将演示如何使用 pub-sub模型向多个用户广播消息以及如何仅向单个用户发送消息。...步骤2:然后,可以配置 Spring启用 WebSocketSTOMP消息传递。...HTTP会话或 STOMP会话标识符可用于此目的。 Spring使发送私人消息变得更加容易。我们只需要使用 @SendToUser注释 Controller的方法。...通信从 SockJS发送 GET /info以从服务器获取基本信息开始。 SockJS根据响应决定使用的哪种传输方式。第一个选择是 WebSocket如果不支持,则尽可能使用 Streaming。

5.4K20

使用消息队列实现 分布式 webSocket

,那么在其中一个服务器建立了WebSocket连接的用户如何给在另外一个服务器上建立了WebSocket连接的用户发送消息呢?...、Kafka等)的的topic,然后每个应用节点都订阅这个topic,在接收到WebSocket消息后取出这个消息的“消息接收者的用户ID/用户名”,然后再比对自身是否存在相应用户的连接,如果存在则推送消息...,否则丢弃接收到的这个消息(这个消息接收者所在的应用节点会处理) 在用户建立WebSocket连接后,使用Redis缓存记录用户的WebSocket建立在哪个应用节点上,然后同样使用消息队列将消息推送到接收者所在的应用节点上面...配置基于Redis的消息队列 需要注意的是,在大中型正式项目中并不推荐使用Redis实现的消息队列,因为经过测试它并不是特别可靠,所以应该考虑使用Kafka、rabbitMQ等专业的消息队列中间件 @Configuration.../1.1.4/sockjs.min.js"> <script src="https://cdnjs.cloudflare.com/ajax/libs/<em>stomp</em>.js/2.3.3

1.4K21

补习系列(20)-大话WebSocket与尬聊的实现

Websocket 出场 WebSocket 出现的目的没有别的,就是 干掉前面的东西,Both!...取消订阅 BEGIN 开启事务 COMMIT 提交事务 ABORT 回滚事务 ACK 确认消费 NACK 消息丢弃 DISCONNECT 断开连接 一个简单的STOMP消息大致如下: CONNECTaccept-version...可能你看完前面的东西会觉得 WebSocket 是如此之强大,以至于很多场景都应该使用这个技术来实现。那么如何做?...还有一个好消息,就是spring-websocket 也默认支持了 Stomp协议(看吧,Stomp支持者太多了)。而除此之外,还内置了一个叫 SocketJS 的东西。...其项目地址:https://github.com/sockjs/sockjs-client 其他组件的说明 webjars 主要是将一些前端的框架打包到Jar包中以方便我们使用,这里我们添加了socketJS

80450

使用消息队列轻松实现 分布式 webSocket

WebSocket连接的用户如何给在另外一个服务器上建立了WebSocket连接的用户发送消息呢?...、Kafka等)的的topic,然后每个应用节点都订阅这个topic,在接收到WebSocket消息后取出这个消息的“消息接收者的用户ID/用户名”,然后再比对自身是否存在相应用户的连接,如果存在则推送消息...,否则丢弃接收到的这个消息(这个消息接收者所在的应用节点会处理) 在用户建立WebSocket连接后,使用Redis缓存记录用户的WebSocket建立在哪个应用节点上,然后同样使用消息队列将消息推送到接收者所在的应用节点上面...配置基于Redis的消息队列 需要注意的是,在大中型正式项目中并不推荐使用Redis实现的消息队列,因为经过测试它并不是特别可靠,所以应该考虑使用Kafka、rabbitMQ等专业的消息队列中间件 @Configuration.../1.1.4/sockjs.min.js"> <script src="https://cdnjs.cloudflare.com/ajax/libs/<em>stomp</em>.js/2.3.3

49910
领券