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的细节,其实并未掌握,看来需要学习的地方还是很多的。


你可能感兴趣的:(技术感悟)