一般情况是:
1.开应用服务器——用户下载——报线程挂起——下载量下降——报线程N长时间没活动,超过was设置的阀值,释放掉。
2.开应用服务器——用户下载——报线程挂起——下载量继续或者上升,挂起线程越来越多——was自动调整线程阀值——调不过来,挂。
经过查找,基本确定问题:是因为用户在用浏览器下载文件时,网络瞬断或其他原因,导致抛出异常,但是下载的线程并未释放。可打开浏览器下载,下到一半直接关掉浏览器来模拟这个现象。
byte[] b = new byte[1024]
...
while ((len = in.read(b)) != -1) {
out.write(b, 0, len)
}
...
登录后复制
修改为
byte[] b = new byte[1024]
...
while ((len = in.read(b)) != -1) {
Thread.sleep(50)
Thread.yield()
out.write(b, 0, len)
}
...
登录后复制
一些人建议的方法是,在服务器端给线程做个时间限制,超过时间的就关掉;但是这样做,较低网速下载大文件的用户,又会受到影响。因此用上面的做法是:线程处理一段时间,停一会,让出CPU控制权,不至于造成堵塞。
这个方法可能不是最好的,但是至少是比较合适的,现在服务器上线程挂起的现象已经大大减少,并且额外加了一句
if (request.getHeader("Range") != null) {
ErrShow(request, response, "不支持多线程!")
return
}
登录后复制
这样避免掉用下载工具的多线程下载。
哪位有更优解,请提出来,一起讨论一下。
刚才看到用守护线程来处理超时线程的解决方案,但另外一个技术主管极力反对,哪位能解释一下,为什么不可用?守护线程在什么情况下可用?谢谢
1、线路问题;2、网络硬件质量有问题,如,双胶线、水晶头、分离器、猫、路由器、网卡。
3、注意分离器、猫、路由器的散热。
4、网卡驱动:换网卡,更新驱动。
5、宽带上网拨号软件:推荐用自带PPPOE拨号软件,断流较少,稳定性高。
6、设置TCP/IP协议。
7、操作系统:操作系统可能对ADSL的相关组件存在兼容性问题,到微软升级,或修复系统。有条件可以重装。
8、软件冲突问题
如果软件有冲突就尽量找出冲突软件,对其卸载或者其他方法解决。
9、病毒问题:虽然受到黑客和病毒的攻击可能性较小,但也不排除可能性,特别是网页病毒和蠕虫病毒。杀毒。
10、防火墙如果上网不稳定,可以尝试先关闭防火墙,测试稳定与否,在进行相应的设置。 另外防火墙引起或IE浏览器出现故障,也可导致可以正常连接,但不能打开网页。
11、静电问题。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)