servlet偶尔出现java.io.IOException

hlf 2011-11-15 03:50:31
我在C#中调用servlet,这个servlet每天响应几千个请求,但只是4、5次报错,我现在连调试都没法做,唉
servlet的代码如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
Connection conn= null;
String cetifyResult =null;
StringBuilder requestData = new StringBuilder();
try {
BufferedReader reqIn = request.getReader();
String readline = null;
while((readline = reqIn.readLine())!=null ) 按照JAVA报错信息,83行指的就是这句 requestData.append(readline);



错误信息为:
java.io.IOException
at org.apache.jk.common.JkInputStream.receive(JkInputStream.java:205)
at org.apache.jk.common.JkInputStream.refillReadBuffer(JkInputStream.java:265)
at org.apache.jk.common.JkInputStream.doRead(JkInputStream.java:183)
at org.apache.coyote.Request.doRead(Request.java:428)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:304)
at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:360)
at org.apache.tomcat.util.buf.CharChunk.substract(CharChunk.java:412)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:408)
at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:105)
at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:154)
at org.ea.test.LicenseCertificationServlet.doPost(LicenseCertificationServlet.java:83)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:774)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:896)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Unknown Source)
...全文
403 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hlf 2011-11-25
  • 打赏
  • 举报
回复
感谢大家的回答,结贴散分了
jc8futao 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kouyisc 的回复:]

Java code

servlet每天响应几千个请求,但只是4、5次报错



这种情况在我们以前项目压力测试socket包的时候也遇到过。。所以我怀疑是不是由于请求过多。处理时太多io数据导致io阻塞或者有数据流丢失现象。就可能导致reqIn.readLine()读取某些行为空。。。

还得你压力测试一下看看。。。你数据量那么大。。应该做过压力测试吧。。这些问题应该是测试阶段就能发……
[/Quote]

网络io丢包也算一个概率不小的事件。这种事情是没有办法的。所以io因为网络原因抛了异常也是比较正常的事情。
kouyiSC 2011-11-22
  • 打赏
  • 举报
回复

servlet每天响应几千个请求,但只是4、5次报错


这种情况在我们以前项目压力测试socket包的时候也遇到过。。所以我怀疑是不是由于请求过多。处理时太多io数据导致io阻塞或者有数据流丢失现象。就可能导致reqIn.readLine()读取某些行为空。。。

还得你压力测试一下看看。。。你数据量那么大。。应该做过压力测试吧。。这些问题应该是测试阶段就能发现的。。。
jc8futao 2011-11-22
  • 打赏
  • 举报
回复
我又搜索了一下,看到了这篇文章
http://www.360doc.com/content/09/0425/01/136961_3259150.shtml

按照这篇文章的说法HttpServletRequest 对象是线程安全的。结合自己的项目,也没发现HttpServletRequest 对象数据混乱的情况。我个人觉得应该不是这个对象的问题。当然,这个还是需要模拟测试一下。应该相信测试,而不相信推论。
jc8futao 2011-11-22
  • 打赏
  • 举报
回复
当然正常的网络流断了也有可能。这个可能需要进一步的测试才知道是不是线程问题。
jc8futao 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bangis 的回复:]

参考这个
http://topic.csdn.net/t/20030816/03/2152573.html
getReader 方法只能调用一次,第二次调用就会抛IO异常,其次 servlet是线程不安全的,加入某一时刻同时调用了这个线程 可能导致线程问题,检查一下吧
[/Quote]
搜索了一下,servlet的成员变量还真不是线程安全的对象。目前找到了几种解决方案,url如下:
http://developer.51cto.com/art/200907/133827.htm

个人觉得如果并发量不大的话,实现 SingleThreadModel 接口是个比较好的选择。
hlf 2011-11-22
  • 打赏
  • 举报
回复
TO:
那怎样才对呢?望指教

TO:BanGis、
我没有重复调用getReader啊,上面已经将出错前的代码全部列出
BanGis 2011-11-16
  • 打赏
  • 举报
回复
参考这个
http://topic.csdn.net/t/20030816/03/2152573.html
getReader 方法只能调用一次,第二次调用就会抛IO异常,其次 servlet是线程不安全的,加入某一时刻同时调用了这个线程 可能导致线程问题,检查一下吧
蓝雪儿 2011-11-16
  • 打赏
  • 举报
回复
应该是输出或输入流的方式不对
hlf 2011-11-15
  • 打赏
  • 举报
回复
发了后排版有点问题,关于出错的语句我再说明一下

while((readline = reqIn.readLine())!=null ) 按照JAVA报错信息,83行指的就是这句

requestData.append(readline);

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧