【Spring源码】WebSocket做推送动作的底层实例

一、前瞻

Ok,开始我们今天的对Spring的【模块阅读】。

在这里插入图片描述

那就挑Web里的WebSocket模块,先思考下本次阅读的阅读线索

  1. WebSocket在Spring里起到什么作用
  2. 这个模块采用了什么设计模式
  3. 我们都知道WebSocket可以主动推送消息给用户,那做推送动作的底层实例究竟是谁

二、探索

我们先整体看下整个模块的组织机构。

在这里插入图片描述

要解决阅读线索3,看起来应该从上图里的server模块开始。

找了一圈发现并没有什么线索,那我们就从阅读官方文档这个方向入手。

在这里插入图片描述

官方文档表面心跳采用了SckJS协议,所以我们应该从图2里的sockjs模块开始探索。

既然是发送消息给用户,那必定有send的动作,我们在sockjs模块全局搜索下。

在这里插入图片描述

我们根据搜索定位到了发送消息的WebSocketSession接口

	/*** Send a WebSocket message: either {@link TextMessage} or {@link BinaryMessage}.* <p><strong>Note:</strong> The underlying standard WebSocket session (JSR-356) does* not allow concurrent sending. Therefore, sending must be synchronized. To ensure* that, one option is to wrap the {@code WebSocketSession} with the* {@link org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator* ConcurrentWebSocketSessionDecorator}.* @see org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator*/void sendMessage(WebSocketMessage<?> message) throws IOException;

整体看下该接口的类图,看下是哪些具体的子类对象实现了sendMessage接口。

在这里插入图片描述

我们找到了以上链条的sendMessage具体实现:

	@Overridepublic final void sendMessage(WebSocketMessage<?> message) throws IOException {Assert.state(!isClosed(), "Cannot send a message when session is closed");Assert.isInstanceOf(TextMessage.class, message, "SockJS supports text messages only");sendMessageInternal(((TextMessage) message).getPayload());}

发现sockjs确实是像官方文档所说的,用户客户端发送心跳给服务器,服务器再使用以上的sendMessageInternal保存心跳。但并不是我们要找的阅读线索3。

我们找下WebSocketSession接口的其他子类链条实现,发现真正发送消息给用户的应该是AbstractWebSocketSession

在这里插入图片描述

可以在代码里找到发送各种消息格式的实现。

到这我们就解决了阅读线索3:

推送动作的底层实例究竟是谁

而关于阅读线索2:WebSocket模块采用了什么设计模式,我们在AbstractWebSocketHandler发现了以下代码块。

public abstract class AbstractWebSocketHandler implements WebSocketHandler {@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {if (message instanceof TextMessage textMessage) {handleTextMessage(session, textMessage);}else if (message instanceof BinaryMessage binaryMessage) {handleBinaryMessage(session, binaryMessage);}else if (message instanceof PongMessage pongMessage) {handlePongMessage(session, pongMessage);}else {throw new IllegalStateException("Unexpected WebSocket message type: " + message);}}protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {}protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {}protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {}@Overridepublic boolean supportsPartialMessages() {return false;}}

可以看到handleMessage方法定义的每个消息格式采用不同的消息处理方法,而这些方法该类并没有实现,而是留给了子类去实现。

也就是说handleMessage方法定义了模板,而具体实现留给了不同子类。

这其实就是采用了模板方法模式

三、总结

而阅读线索1:WebSocket在Spring里起到什么作用,我们可以在官方文档里找到答案。

在这里插入图片描述

未完待续。。。

好了,今天的分享就到这👀。大家能否感受到通过按【模块阅读】这种方式来阅读源码的乐趣呢

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大家快来听,分享一个寄快递省钱赚钱的方法哦!

大家再寄快递的时候&#xff0c;会有很多种方法来供我们选择&#xff0c;可以直接去驿站寄快递&#xff0c;但是这样是不是想的略微麻烦了&#xff0c;可以在官网上下单&#xff0c;快递员上门取件&#xff0c;但是价格也是不便宜的吧&#xff0c;如果是公司一下子大批量的寄件…

Linux系统常用命令

Linux系统常用命令 文章目录 Linux系统常用命令一、系统管理类二、文件与目录管理类|三、文件与目录管理类||四、网络管理类五、磁盘管理类六、Oracle常用命令七、QData常用命令 一、系统管理类 二、文件与目录管理类| 三、文件与目录管理类|| 四、网络管理类 五、磁盘管理类 六…

量化交易入门(二十八)什么是布林带,量化中怎么使用

什么叫布林带 布林带&#xff08;Bollinger Bands&#xff09;是一种常用的技术分析指标&#xff0c;由约翰布林&#xff08;John Bollinger&#xff09;于20世纪80年代开发。它由三条线组成&#xff1a;中轨&#xff08;通常为20日移动平均线&#xff09;、上轨&#xff08;中…

类的成员之三:构造器(Constructor)

类的成员之一&#xff1a;成员变量 (field) 类的成员之二&#xff1a;方法 (method) 我们 new 完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻 烦了。我们能不能在new 对象时&#xff0c;直接…

二维随机变量的条件分布-已知X概率密度,X条件下的Y概率密度求解y的概率密度

问题&#xff1a;设数X在区间(0,1)上随机地取值,当观察到Xx(0<x<1)时,数Y在区间(x,1)上随机地取值.求Y的概率密度f(y)&#xff1f; 求解&#xff1a; 首先&#xff0c;数X在区间(0,1)上均匀分布&#xff0c;因此其概率密度函数fX​(x)为&#xff1a; fX​(x)1 0<…

【探索Linux】—— 强大的命令行工具 P.31(守护进程)

阅读导航 引言一、守护进程简介1. 概念2. 特点 二、用C创建守护进程⭕代码✅主要步骤 温馨提示 引言 当谈到计算机系统中运行的特殊进程时&#xff0c;守护进程&#xff08;daemon&#xff09;无疑是一个备受关注的话题。作为在后台默默运行并提供各种服务的进程&#xff0c;守…

【产品经理】华为IPD需求管理全思路分享!

作为一名产品经理&#xff0c;会在日常工作中接收到各种需求&#xff0c;而解决需求要提供对应的解决方案。本篇文章以华为的IPD需求管理流程为例&#xff0c;探讨其需求管理思路&#xff0c;帮助产品岗位的你快速做好需求管理并解决方案。 一、理清什么是产品需求 说到这个话…

Matlab|电动汽车充放电V2G模型

目录 1 主要内容 1.1 模型背景 1.2 目标函数 1.3 约束条件 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消…

httpx+nuclei实战 | 大华智慧园区综合管理平台任意密码读取漏洞

漏洞成因 没有对接口进行严格的权限管理&#xff0c;导致可以通过访问user_getUserInfoByUserName.action获取system用户的MD5加密后的密码 hunter语法 web.icon"4644f2d45601037b8423d45e13194c93"&&web.title"智慧园区综合管理平台" POC GET…

【计算机择校】“西电“和“西交“那个更好?

那肯定还是建议去西交&#xff0c;两个学校还是有一定差距的&#xff0c;985高校的资源不容小觑... 本人双非科班出身备考408成功上岸&#xff0c;在这里也想给想考408的学弟学妹们一些很中肯的&#xff0c;学习建议。 我是科班水过408的四门课 说实话&#xff0c;大部分准备…

总结TCP各类知识点

前言 本篇博客博主将详细地介绍TCP有关知识点&#xff0c;坐好板凳发车啦~ 一.TCP特点 1.有连接 TCP传输的过程中类似于打电话的各个过程 2.可靠传输 通过TCP自身的多种机制来保证可靠传输 3.面向字节流 内容是以字节的方式来进行发送与接收 4.缓冲区 TCP有接收缓冲区…

什么是CSS?

一.CSS&#xff08;层叠样式表&#xff09;&#xff1a;是一种用于描述网页内容任何呈现的样式的语言&#xff0c;它和html&#xff08;超文本标记语言&#xff09;一起用于创建网页和Wed应用程序。 W3C标准&#xff1a;网页主要由三部分组成 结构&#xff1a;html 表现&#x…