在做项目的时候,碰到一个问题。项目运行一段时间就会出现lientAbortException: java.io.IOException: Broken pipe错误。该项目是每个0.5或1s发一个http请求,每个http请求大概要4、5s的处理时间。刚开始以为是并发能力的问题,根据网上说的进行优化,但是不起作用,问题依旧。经初步查看,估计是每个http请求时间比较长,造成线程阻塞。后来在网上查到servlet3.0多了个异步处理的功能,好像能解决我们目前出现的问题。
但是在配置servlet3.0的时候,出现了一些问题,现一一说明:
首先servlet3.0的tomcat要7.0,jdk要1.7的版本。在各自的官网上下载
tomcat7.0: http://tomcat.apache.org/download-70.cgi
jdk1.7:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
1. 在maven上引入servlet3.0。之前以为只要在原来的基础上把version改为3.0即可。结果发现不行。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
查maven repository得知,正确的应该如下:
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
</dependency>
2. web.xml的配置。之前的配置
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
但是3.0的配置应该是:
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
异步功能是默认关闭(false)的,如果要使用的话就配置为true。之前没有改还是用的2.4的,但2.4没有async-supported
<servlet>
<servlet-name>receiveServlet</servlet-name>
<servlet-class>com.tvunetworks.center.tpds.web.servlet.online.ReceiveServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
3. 在ReceiverServlet的doGet方法中:
AsyncContext ctx=request.startAsync();
process1(request,response);
ctx.complete();
但是结果怎么样还没有测试。。。