日期:2014-05-17  浏览次数:20807 次

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掉这些进程。

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

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