jetty6部署环境下,大文件上传超时后被重复上传问题的解决

     写的后台管理系统一直有一个bug,就是上传一个文件到后台,对于需要较长时间处理的文件,超时后这个文件被再次上传。刚开始百思不得其解,还以为是Http请求本身的机制就是这样。这几天我从前台开始排查,找到JS里send()函数,断点监控前台是否多次send(),发现前台没有多次send()。

     在后台解析上传文件调试时,突然爆出:

     JVM BUG(s) - injecting delay1 times

     JVM BUG(s) - recreating selector 1 times, cancelled keys 32 times

     与此同时,文件被再次上传的响应启动了。好的,锁定bug.

     经查,这个bug最开始是JAVA NIO的bug,Jetty 6中对其进行了处理具体处理的原则在https://wiki.eclipse.org/Jetty/Feature/JVM_NIO_Bug中有详细说明。

     我在其中看到有这么一句话:

Recreating Selector

If cancelling keys does not avoid the JVM bugs, when the JVMBUG_THRESHOLD is reached, Jetty discards the entire select set and creates a new one.

     意思是说Jetty在遇到JVM的这个bug时,并且超时已到,就会丢弃整个选择,然后重新创建一个选择。或许这就是导致我文件多次上传的原因。

     在这篇帖子中:http://codefine.co/100.html,作者说在最新的jetty中已经把这个问题修正。我把我的jetty6升级到jetty 8,OK问题得以解决。

    

     这个bug困扰我快半年了,一直找不到出错的原因,这几天集中精力把他解决掉,找到原因,也算有所获得,然而对于这个bug的细节,其实并未掌握,看来需要学习的地方还是很多的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值