- 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掉这些进程。
希望对遇到同样问题的同学有所帮助。
心得:在遇到问题的时候,不能把思路只放在局部,而要善于用联系的眼光来分析。