JAVA WebSocket 使用时需要注意的地方
最近在做一个项目,需要用WebSocket与另外一个平台建立通讯,来获取项目业务需要的实时数据,因此项目一启动,后台就要与另外一个平台建立WebSocket连接并且要保证他们的之间有且只有一条持续畅通可用的连接(就是要保证这条连接不能断开,一断开就要尝试进行重连),说说我在这个过程中,遇到的一些问题以及解决的方法:
1、WebSocket连接正常,部分请求无响应
原因分析:
服务端/客户端接收到客户端/服务端一次性发来的几百条或更多的请求,瞬间都堆积在会话的缓冲区,又没做多线程处理,并且每接收到一条请求还要查询阿里云服务器数据库,加上网络带宽过小,处理一条请求就要花费几十秒;导致线程队列严重堵塞,无法及时响应处理后续的其他请求。
解决方法:
使用了线程池开启多条线程同时进行处理,将数据库配置设置为127.0.0.1,这样就不会经过公网绕一圈回来,这样大大缩短了一条请求处理要花费的时间,由之前的几十秒缩短为几百毫秒。
// 创建线程池
//private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
注意几种线程池的区别,cachedThreadPool只有非核心线程,最大线程数很大,它会为每一个任务添加一个新的线程,它有一个超时机制,当空闲的线程超过60s内没有用到的话,就会被回收。cachedThreadPool缺点就是没有考虑到系统的实际内存大小。fixedThreadPool是一个可以指定线程数的线程池,有核心的线程,里面有固定的线程数量,响应的速度快。正规的并发线程,多用于服务器。核心线程是没有超时机制的,队列大小没有限制,除非线程池关闭了核心线程才会被回收。还有singleThreadPoll、scheduledThreadPoll这里就不做过多的介绍了。
@OnMessage
public void onMessage(String datas,Session session) {
Runnable t = new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
// 业务代码
}
}; //cachedThreadPool.submit(t);
fixedThreadPool.submit(t);
}
注意,要给session加上同步锁,否则会出现多个线程同时往同一个session写数据,导致报错的情况。
public void send(String data) throws Exception {
synchronized (session) {
session.getBasicRemote().sendText(data);
}
}
2、发现WebSocket连接老是每隔一、两分钟就断开重连
原因分析:
一段时间内,WebSocket连接无数据传输就会自动断开连接
解决方法:
增加心跳机制维持连接,每隔一段时间就向服务端发送一次自定义请求,或者调用sendPing()来保持住连接。
3、WebSocket定时发送sendPing()后,还会反复出现接收/发送几个请求就断开连接的情况
原因分析:
无论是作服务端还是客户端,发现每次都是接收到同一个请求的信息后连接就断开了,经过反复的摸索发现,是由于接收到的这个请求传输的数据量过大,超出了WebSocket会话接收信息的缓冲区的大小(可使用session.getMaxTextMessageBufferSize()查看缓冲大小,默认为8192),引起的WebSocket连接的异常断开。
解决方法:
重新设置WebSocket缓冲区大小,
int maxSize = 200 * 1024; // 200K // 可以缓冲的传入二进制消息的最大长度 session.setMaxBinaryMessageBufferSize(maxSize); // 可以缓冲的传入文本消息的最大长度 session.setMaxTextMessageBufferSize(maxSize);
JAVA WebSocket 使用时需要注意的地方的更多相关文章
- 【SpringMVC】<context:include-filter>和<context:exclude-filter>使用时要注意的地方
http://jinnianshilongnian.iteye.com/blog/1762632 http://blog.51cto.com/wenshengzhu/1700340 http://ww ...
- <context:component-scan>子标签:<context:include-filter>和<context:exclude-filter>使用时要注意的地方
在Spring MVC中的配置中一般会遇到这两个标签,作为<context:component-scan>的子标签出现. 但在使用时要注意一下几点: 1.在很多配置中一般都会吧Spring ...
- Java 中无返回值的方法在使用时应该注意的问题
Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具 ...
- Java : 对象不再使用时,为什么要赋值为 null ?
今天遇到一个比较有意思的问题,对象不再使用时,为什么要赋值为 null ? 在这里我看到一篇文章说的不错,下面是网址,有兴趣的IT友可以看看. https://mp.weixin.qq.com/s/Z ...
- java比.net优美的一个小地方
用了四年的.net,今年转做java,内心一直吐槽java的烦琐,今天发现了一个java值得我为之点赞的地方 java的枚举居然可以这么玩,废话不多,上demo package com.sunline ...
- 这个demo是为解决IQKeyboardManager和Masonry同时使用时,导航栏上移和make.right失效的问题
原文链接在我的个人博客主页 (一).引言: 在 IQKeyboardManager 和 Masonry 同时使用时,导航栏上移和make.right失效等问题多多. 其实我们完美的效果应该是这样的:* ...
- Saiku嵌入系统使用时传参数访问saiku(十六)
Saiku嵌入系统使用时传参数访问saiku Saiku通过iframe嵌入其他系统使用时,我们可以设定参数信息,然后根据url中参数对结果进行筛选哦. 这里我们实现的是根据日期字段进行范围查询,UR ...
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动
重新安装MySQL数据库,由于安装的时候马虎,一路next(事实上,某些地方需要严格的配置,我忘记注意了),导致现在出了很多麻烦. 错误信息: 本地计算机上的MySQL服务启动后停止.某些服务在未由其 ...
- free函数使用时的注意事项。
free函数是我们在写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核. 注意:free函数与malloc()函数配对使用,malloc函数释放申请的动态内存.对于free(p)这 ...
随机推荐
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- Objection基本原理
1,Objection 的简介 就是一个依赖注入框架,github地址:https://github.com/atomicobject/objection 2,Objection 原理 3,Objec ...
- XAMPP下MYSQL中文乱码问题的解决
XAMPP下MYSQL中文乱码问题的解决 现象描述: 安装完成XAMMP后,内置有MySQL数据库. 新建好自己的数据库后通过hibernate往表里面添加一些中文信息时全部乱码变成“??”. 问题解 ...
- 解决css布局时两个div一个宽度固定另一个占满剩余宽度的问题
/*左侧div*/ .left-div{width: 220px;height: 100%;position: fixed;background: #FFFFFF;} /*右侧div*/ .right ...
- 洛谷训练新手村之“BOSS战-入门综合练习2”题解
P1426 小鱼会有危险吗 题目链接:https://www.luogu.com.cn/problem/P1426 题目大意: 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每 ...
- 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
- docker概述和基本命令
命名空间 Docker使用一种称为namespaces提供隔离工作空间的技术来称为容器.当您运行容器时,Docker会为该容器创建一组 名称空间. 这些命名空间提供了一层隔离.容器的每个方面都在一个单 ...
- 傅立叶变换—FFT(cuda实现)
背景: 无意间看到cuda解决FFT有一个cufft函数库,大体查看了有关cufft有关知识,写了一个解决一维情况的cuda代码,据调查知道cufft在解决1D,2D,3D的情况时间复杂度都为O(nl ...
- solr学习(一)安装与部署
经过测试,同步MongoDB数据到Solr的时候,Solr版本为8.4.0会出现连接不上的错误,8.3.0未经测试不知,博主测试好用的一版为8.2.0,但是官网已经下不到了,所以我会把下载链接放在文末 ...
- Dockerfile文件记录(用于后端项目部署)
Dockerfile文件记录(用于后端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理) 此文结合另一篇博客共同构成后端服 ...