我在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)

解决方案 »

  1.   

    发了后排版有点问题,关于出错的语句我再说明一下while((readline = reqIn.readLine())!=null ) 按照JAVA报错信息,83行指的就是这句 requestData.append(readline);
      

  2.   

    参考这个
    http://topic.csdn.net/t/20030816/03/2152573.html
    getReader 方法只能调用一次,第二次调用就会抛IO异常,其次 servlet是线程不安全的,加入某一时刻同时调用了这个线程 可能导致线程问题,检查一下吧
      

  3.   

    TO:
    那怎样才对呢?望指教TO:BanGis、
    我没有重复调用getReader啊,上面已经将出错前的代码全部列出
      

  4.   

    搜索了一下,servlet的成员变量还真不是线程安全的对象。目前找到了几种解决方案,url如下:
    http://developer.51cto.com/art/200907/133827.htm个人觉得如果并发量不大的话,实现 SingleThreadModel 接口是个比较好的选择。
      

  5.   

    我又搜索了一下,看到了这篇文章
    http://www.360doc.com/content/09/0425/01/136961_3259150.shtml按照这篇文章的说法HttpServletRequest 对象是线程安全的。结合自己的项目,也没发现HttpServletRequest 对象数据混乱的情况。我个人觉得应该不是这个对象的问题。当然,这个还是需要模拟测试一下。应该相信测试,而不相信推论。
      

  6.   


    servlet每天响应几千个请求,但只是4、5次报错
    这种情况在我们以前项目压力测试socket包的时候也遇到过。。所以我怀疑是不是由于请求过多。处理时太多io数据导致io阻塞或者有数据流丢失现象。就可能导致reqIn.readLine()读取某些行为空还得你压力测试一下看看你数据量那么大。。应该做过压力测试吧。。这些问题应该是测试阶段就能发现的
      

  7.   


    网络io丢包也算一个概率不小的事件。这种事情是没有办法的。所以io因为网络原因抛了异常也是比较正常的事情。