Spring WebSocket踩坑指南

本次公司项目中需要在后台与安卓App间建立一个长连接,这里采用了Spring的WebSocket,协议为Stomp。

关于Stomp协议这里就不多介绍了,网上一搜一大把,这里主要说下在配置过程的踩过的那些坑。

官网才是首选

首先在我们第一次尝试WebSocket肯定会搜寻各种各样的博客,在看完关于Stomp和长连接的基础知识,确定使用Spring WebSocket后,请马上进入官网Spring WebSocket,并下载该网站右侧的源码,这将节省大量时间。网上的各个博客都是对官网的一定翻译而已,重复性的内容过多,直接阅读官网就好。接下来就是一步步排雷组装到自己的项目中了。

正因为官网的存在,本篇文章只讲踩坑,配置步骤详见官网文档与源码。

依赖

    <!-- stomp协议websocket长连接 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<!-- 该部分的版本号一般与当前项目的Spring版本号一致即可 -->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 长连接中消息的传递使用JSON格式,
该依赖帮助Spring自动在Object与JSON之间转换,
不加的话会在传递消息时报错-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>

spring扫描问题

在项目配置过程中,我出现了客户端无法向服务器发送请求的错误。事实上服务器已经收到了请求,此时打印日志:

No matching message handler methods.

此时我们的目标是客户端向服务器的指定接口发送数据,日志的意思为服务器已经接收到消息但没有合适的方法去处理它。这是因为在所需处理的方法上的注解@Message并没有被Spring MVC扫描到。在Spring Boot中不会出现这个问题,但在Spring MVC中可以查看配置文件spring-mvc.xml中在组件扫描中是否加入了use-default-filters="false"。use-default-filters="true"为默认配置,即允许Spring扫描配置包下的所有组件;而设为false后仅允许Spring控制网站的跳转逻辑,忽略了@Message注解。删除即可。

web.xml 3.0

Java Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "<async-supported>true</async-supported>" to servlet and filter declarations in web.xml. Also you must use a Servlet 3.0+ container

报错很清晰了,请将web.xml从2.0修改为3.0,并在filter中加入配置<async-supported>true</async-supported>,作用是支持异步处理。

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

302

这是在使用SockJS时出现的问题。这是因为我们项目中使用了Shiro作为权限管理,将所需暴露的接口配置一下即可。

https - wss 403

如果我们网站正式服务器采用了https协议,那么相对应的WebSocket的协议必须为wss。否则出现403问题。解决的另一种情况可以参见Nginx反向代理WebSocket响应403的解决办法,不过我没有使用它,也没有测过。

handshake: Unexpected response code: 400

这是由于正式服务器中采用了NGINX作为反向代理,这里需要更新下NGINX配置,具体如下:

    location /{
proxy_pass http://wsbackend;
// 解决下面60s自动断开的问题
proxy_read_timeout 600s;
# WebSocket support (nginx 1.4),加入以下几行
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
} }

WebSocket 60s自动断开连接

还是NGINX问题。解决方案已经在上面指出。proxy_read_timeout 默认为60s,如果NGINX对一个长连接在读取一次数据60s后没有再次接收到消息,则认为已超时,并关闭该连接,所以前端很准时的60s后开始报错。这里将时间修改到了10分钟,可以根据自己情况调整。

心跳

继续上面的话题,即使修改了超时时间为10分钟也没有实质性的改变,这时候心跳包就需要登场了。心跳包设计可以参考一种心跳,两种设计| 徐靖峰|个人博客高效保活长连接:手把手教你实现 自适应的心跳保活机制这两篇博客。第二篇博客更多关于安卓端。

安卓端SDK

这里我在GitHub上找了一个包:

'com.github.forresthopkinsa:StompProtocolAndroid:17.09.1'
```;
具体见[GitHub](https://github.com/NaikSoftware/StompProtocolAndroid)。 ## 安卓端进程防杀死补充 这部分可以参考[FV悬浮球的说明](https://www.kancloud.cn/sealt/fooview/382748)。同时也推荐下这款软件,在安卓上的手势辅助功能很好用。 End.

Spring WebSocket踩坑指南的更多相关文章

  1. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  2. 树莓派4B踩坑指南 - (15)搭建在线python IDE

    今天想在树莓派上自己搭一个在线的python IDE,于是找到了一篇教程--Fred913大神的从头开始制作OJ-在线IDE的搭建 自己尝试动手做了一下, 还是发现不少细节需要注意, 记录在此 如果不 ...

  3. 正则表达式 test 踩坑指南

    正则表达式 test 踩坑指南 test 只能使用一次,第二次返回的是错误结果! reg = /edg|edge/g; /edg|edge/g reg.test(`edg`) true reg.tes ...

  4. Taro 开发踩坑指南 (小程序,H5, RN)

    Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...

  5. 小程序 & taro 踩坑指南

    小程序 & taro 踩坑指南 微信开发者工具, 不支持 react bug https://github.com/NervJS/taro/issues/5042 solution just ...

  6. Nuxt.js的踩坑指南(常见问题汇总)

    本文会不定期更新在nuxt.js中遇到的问题进行汇总.转发请注明出处,尊重作者,谢谢! 强烈推荐作者文档版踩坑指南,点击跳转踩坑指南 在Nuxt的官方文档中,中文文档和英文文档都存在着不小的差异. 1 ...

  7. Java 热更新 Groovy 实践及踩坑指南

    Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用 ...

  8. 『OGG 02』Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南

    上一文章 <__Win7 配置OGG(Oracle GoldenGate).docx>定下了 两个目标: 目标1: 给安装的Oracle_11g 创建 两个用户 admin 和 root ...

  9. Microsoft SQL Server on Linux 踩坑指南

    微软用 SQL Server 在 2016 年的时候搞了一个大新闻,宣传 Microsoft ❤️ Linux 打得一众软粉措手不及.但是这还是好事情,Linux 上也有好用的 SQL Server ...

随机推荐

  1. java常用设计模式四:观察者模式

    1.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.观察者模式又叫发布-订阅(Publis ...

  2. mysql学习之路_字段类型与属性2

    字段属性: 主键,唯一键,自增长. 主键: Primary key 主要的键,一张表只能有一个字段能使用对应的键,用来唯一约束该字段里面的数据不能重复,称之为主见. 一张表最多只有一个主键. 增加主键 ...

  3. 第32章:MongoDB-索引--Capped固定集合

    ①Capped集合(固定集合) Capped集合的大小固定,性能好,如果空间用完了,新的对象会覆盖旧的对象. find时默认就是插入的顺序,Capped集合会自动维护. ②语法 db.createCo ...

  4. querySelectorAll()方法

    querySelectorAll()方法 调用的对象包括:Document(文档) DocumentFragment(文档片段) Element(元素) querySelectorAll()方法接收的 ...

  5. C++的重载流输出运算符

    // 下列代码输出什么?#include <iostream>#include <string>// typedef basic_ostream<char> ost ...

  6. FatMouse's Speed (hdu 1160)

          #include <iostream> #include <cstdio> #include <cstring> #include <algori ...

  7. Java的StringBuffer和StringBuilder类

    StringBuffer (字符串缓冲对象) 概念:用于表示可以修改的字符串,称为字符串缓冲对象 作用:使用运算符的字符串将自动创建字符串缓冲对象 例如: str1+str2的操作,实际上是把str1 ...

  8. All Start Here.

    缘由 本博客是为天大软院 2016 级研一课程"现代软件工程"的课程设计而开设.同时借此机会和同学们进行技术交流与分享. 我们小组共有四位成员: 陈岩岩 2016218020 刘莞 ...

  9. python 的 字节码 导入使用

    1. python 模块文件可以通过编译为字节码的形式: 名字:model.py x = def funt(): import model print(model.x) x = "zhang ...

  10. POJ 1745 线性和差取余判断

    POJ 1745 线性和差取余判断 题目大意:每个数都必须取到,相加或相减去,问所有的方案最后的得数中有没有一个方案可以整除k 这个题目的难点在于dp数组的安排上面 其实也就是手动模仿了一下 比如 一 ...