Spring WebSocket踩坑指南
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踩坑指南的更多相关文章
- 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 ...
- 树莓派4B踩坑指南 - (15)搭建在线python IDE
今天想在树莓派上自己搭一个在线的python IDE,于是找到了一篇教程--Fred913大神的从头开始制作OJ-在线IDE的搭建 自己尝试动手做了一下, 还是发现不少细节需要注意, 记录在此 如果不 ...
- 正则表达式 test 踩坑指南
正则表达式 test 踩坑指南 test 只能使用一次,第二次返回的是错误结果! reg = /edg|edge/g; /edg|edge/g reg.test(`edg`) true reg.tes ...
- Taro 开发踩坑指南 (小程序,H5, RN)
Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...
- 小程序 & taro 踩坑指南
小程序 & taro 踩坑指南 微信开发者工具, 不支持 react bug https://github.com/NervJS/taro/issues/5042 solution just ...
- Nuxt.js的踩坑指南(常见问题汇总)
本文会不定期更新在nuxt.js中遇到的问题进行汇总.转发请注明出处,尊重作者,谢谢! 强烈推荐作者文档版踩坑指南,点击跳转踩坑指南 在Nuxt的官方文档中,中文文档和英文文档都存在着不小的差异. 1 ...
- Java 热更新 Groovy 实践及踩坑指南
Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用 ...
- 『OGG 02』Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南
上一文章 <__Win7 配置OGG(Oracle GoldenGate).docx>定下了 两个目标: 目标1: 给安装的Oracle_11g 创建 两个用户 admin 和 root ...
- Microsoft SQL Server on Linux 踩坑指南
微软用 SQL Server 在 2016 年的时候搞了一个大新闻,宣传 Microsoft ❤️ Linux 打得一众软粉措手不及.但是这还是好事情,Linux 上也有好用的 SQL Server ...
随机推荐
- DevExpress 只允许修改指定列
gridView1.OptionsBehavior.Editable = true; gridView1.OptionsBehavior.ReadOnly = false; foreach (Grid ...
- maven使用中遇到的问题
一>手动将jar包安装到仓库的命令示例: 首先:编写命令:mvn install:install-file -Dfile=D:\lucene-highlighter-4.10.2.jar -Dg ...
- chmod用法
以下是chmod的详细用法:chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设 ...
- 12-简单认识下margin
margin margin:外边距的意思.表示边框到最近盒子的距离. /*表示四个方向的外边距离为20px*/ margin: 20px; /*表示盒子向下移动了30px*/ margin-top: ...
- poj2774 sa模版
学习地址:http://blog.csdn.net/yxuanwkeith/article/details/50636898 #include<iostream> #include< ...
- How to Start a Business in 10 Days
With an executive staffing venture about to open, a business loan from the in-laws gnawing at her co ...
- CentOS 6.0 安装配置rails 2.3.11 + redmine 1.2.1 笔记
没想到安装过程这么曲折,gem安装时下载经常是不成功的,无耐只好把.gem文件下载回来再本地安装,加上radmine 1.2.1对各组件的版本了也比较挑剔,中间走了不少弯路,折腾了二天时间,终于摸清路 ...
- Java的String类
String类 String是引用数据类型:字符串是String类的对象 String类的构造方法 共有13种重载方式,这里只示例常用的几个 String():创建一个空字符串 String(Stri ...
- Poj2296
题意:给定n个点,然后在每个点在一个正方形的上边或者下边的中点,并且所有的正方形等大且不能重叠.求正方形最大的边长是多少. 思路:很明显的二分边长+判定.不过判定要用到2-sat,算是2-sat的入门 ...
- Python自动化开发 - Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy 一.pymysql pymsql是Python中操作MySQL的模块,其使用方法和mysq ...