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 ...
随机推荐
- MES制造执行系统
mes : Manufacturing Execution System 制造执行系统 起因:ERP系统和底层设备之间出现了断层. 包括资源管理,生产调度,单元分配,生产跟踪,性能分析,文档管理,人 ...
- C++STL priority_queue
priority_queue优先级队列 最大值优先级队列(队头是最大值) 最小值优先级队列(队头是最小值) priority_queue<int> q1;//默认定义为最大值优先级队列 ...
- mysql 查询中文字段 没有结果的解决方法
代码如下: $conn = new mysqli('localhost', 'root', '', 'excel');$sql = "select 中信一级行业 from excel gro ...
- Java 获取最近时间
public static String getStatetime() throws ParseException{ SimpleDateFormat sdf = new SimpleDateForm ...
- Everything的简单使用
1.Everythings下载地址: http://www.voidtools.com/ 下载完后直接解压,运行everything.exe即可打开使用: 2.基本设置 (1)去除不需要搜索的文件夹: ...
- Tensorflow RNN_LSTM实例
RNN的一种类型模型被称为长短期记忆网络(LSTM).我觉得这是一个有趣的名字.它听起来也意味着:短期模式长期不会被遗忘. LSTM的精确实现细节不在本文的范围之内.相信我,如果只学习LSTM模型会分 ...
- silverlight 父窗体传值给ChildWindow
在网上找了许多列子,有的没有看懂,有的太麻烦. 现在有两种方法又简单又实用的,分享给大家! 第一种:使用构造函数传值 1.子页面新建一个构造函数 public ChildWindowTest(stri ...
- springboot工程读取配置文件application.yml的写法18045
现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...
- 实用shell命令100条
1,echo "aa" > test.txt 和 echo "bb" >> test.txt //>将原文件清空,并且内容写入到文件中, ...
- Android webview 退出时关闭声音 4.视频全屏 添加cookie
全屏问题,可以参考 http://bbs.csdn.net/topics/390839259,点击 webView = (WebView) findViewById(R.id.webView); vi ...