一次临时参与一个项目的上线前的压力测试工作,当模拟高并发请求后台servlet的时候,后台报错:
org.jboss.resteasy.spi.UnhandledException: Response is committed, can't handle exception
Caused by: java.lang.IllegalStateException: getWriter() has already been called for this response
网上说应该将 getWriter() 改成 outputStream() ,改成后又报错:
java.io.CharConversionException: Not an ISO 8859-1 character
后面又有人说加上 reset() , 改成后还报错:
java.lang.IllegalStateException: Cannot call reset() after response has been committed
决定从代码的角度找问题,发现写此代码的人,将 request 和 response 设置成了类的全局变量;
protected HttpServletRequest _request;
protected HttpServletResponse _response;
public void setServletRequest(HttpServletRequest request) throws UnsupportedEncodingException {
this._request = request;
request.setCharacterEncoding("UTF-8");
uiView.setRequest(request);
}
public void setServletResponse(HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "text/html;charset=UTF-8");
this._response = response;
}
由于servlet 是单实例多线程的,使用全局变量很可能会引发线程不安全问题;
于是去掉这里的全局变量,直接使用方法的 request 和 response ;在进行压力测试,程序确实正常了;
----------------------------------------------
极限压力的情况下,还是出现了下面的错误,暂时没找到处理办法;待牛逼的大神来帮忙处理;
java.nio.BufferOverflowException: null
at java.nio.Buffer.nextPutIndex(Buffer.java:521)
at java.nio.HeapCharBuffer.put(HeapCharBuffer.java:169)
at java.nio.CharBuffer.put(CharBuffer.java:924)
at org.apache.catalina.connector.OutputBuffer.transfer(OutputBuffer.java:860)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:521)
at org.apache.catalina.connector.CoyoteWriter.write(CoyoteWriter.java:170)
at org.apache.catalina.connector.CoyoteWriter.write(CoyoteWriter.java:180)
at org.apache.catalina.connector.CoyoteWriter.print(CoyoteWriter.java:244)
at org.apache.catalina.connector.CoyoteWriter.println(CoyoteWriter.java:312)
java.lang.NullPointerException: null
at org.apache.coyote.http11.Http11OutputBuffer.commit(Http11OutputBuffer.java:368)
at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1354)
at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:258)
at org.apache.coyote.Response.action(Response.java:175)
at org.apache.coyote.Response.sendHeaders(Response.java:357)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:303)
at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:263)
at org.apache.catalina.connector.CoyoteWriter.close(CoyoteWriter.java:108)