当前位置: 代码迷 >> Java Web开发 >> java itext导出报Connection reset by peer: socket write error,该怎么处理
  详细解决方案

java itext导出报Connection reset by peer: socket write error,该怎么处理

热度:4524   发布时间:2013-02-25 21:10:45
java itext导出报Connection reset by peer: socket write error
Java code
public static void createReport(HttpServletRequest request,            HttpServletResponse response, List<Diary> list) throws Exception{        String title = null;           if(list.size() != 0){               title = list.get(list.size() - 1).getCreateDate() + " ~ " + list.get(0).getCreateDate() + "日志";           }           System.out.println(title);        //设置文件响应信息        String showFileName =URLEncoder.encode(title + ".doc", "UTF-8");        showFileName = new String(showFileName.getBytes("iso8859-1"), "gb2312");        //定义输出类型        response.reset();        response.setContentType("application/vnd.ms-word;charset=utf-8");        response.setHeader("Pragma", "public");        response.setHeader("Cache-Control", "max-age=30");        response.setHeader("Content-disposition", "attachment; filename="+ new String(showFileName.getBytes("gb2312"), "iso8859-1"));        Document doc=new Document(PageSize.A4,50,50,50,50);        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();        RtfWriter2.getInstance(doc, byteArrayOutputStream);        doc.open();               //添加标题        Paragraph paragraph=new Paragraph(title,ReportFontFactory.getFontChinese(Font_Type.TITLE));        paragraph.getFont().setColor(230, 20, 220);        paragraph.getFont().setSize(18);        paragraph.setAlignment(Paragraph.ALIGN_CENTER);        doc.add(paragraph);        for(Diary d : list){            doc.add(new Paragraph());            Paragraph p = new Paragraph("        标题:" + d.getTitle()+"        类型:" + d.getType()+"        天气:" + d.getWeather() +"        日期:" + d.getCreateDate());            p.getFont().setStyle(Font.BOLD);            p.getFont().setColor(100, 0, 0);            doc.add(p);            doc.add(new Paragraph("    " + d.getContent()));        }        doc.close();        ServletOutputStream outputStream=response.getOutputStream();        byteArrayOutputStream.writeTo(outputStream);        outputStream.flush();        outputStream.close();    }


------解决方案--------------------------------------------------------
这个问题网上有很多解决的方法,但是都局限于这几种:

 

1:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;

2:客户关掉了浏览器,而服务器还在给客户端发送数据;

3:浏览器端按了Stop;

4:服务器给客户端响应结果给防火墙拦截了。

但是我排查了很久都还是找不到原因,刚开始以为是连接池的原因,搞了好几种连接池都还是这样,无奈只能把这个问题放下,但是每天看到都是很心烦,今天终于又鼓起勇气来排查这个问题,首先是写了一个打印,发现每次访问首页,这个打印始终执行很多次,后来终于把错误来源锁定到了一段自动载入图片的代码中,终于才发现我在web.xml中配置了404跳转到首页,而首页有一张图片丢失了,所以浏览器在载入这个图片的时候,服务器又会抛出404错误,然后转向到首页,而首页又找不到这个图片,就继续抛出404,就陷入了一个死循环,这样就是为什么一段打印代码会执行很多次的原因了。当这个死循环达到一定深度,就会触发上面第一个原因:服务器的并发数超过了其承载量,然后就会自动Down掉这些进程。

希望对遇到同样问题的同学有所帮助。

心得:在遇到问题的时候,不能把思路只放在局部,而要善于用联系的眼光来分析。

  相关解决方案